- stream的使用非常的方便
- 可以用来操作集合和数组
首先我么来看一个代码的需求:从集合中筛选出所有姓张的人出来,并且长度为3的人
package Stream;
import java.util.ArrayList;
import java.util.Collections;
import java.util.List;
public class StreamDemo {
public static void main(String[] args) {
//从集合中筛选出所有姓张的人出来,并且长度为3的人
List<String> lists = new ArrayList<>();
//添加对象
Collections.addAll(lists,"张无忌","张三丰","张三","白毛狮王","殷素素","赵敏","周芷若");
//正常的思维方法:
//1.遍历集合 筛选出姓张的 放到集合中
List<String> listZhangs = new ArrayList<>();
lists.forEach(s ->{
if(s.startsWith("张")){
listZhangs.add(s);
}
});
//2.从姓张的集合中筛选名字长度为三的
listZhangs.forEach(s ->{
if(s.length() == 3){
System.out.println(s);
}
});
System.out.println("-----------------------------");
//Stream 操作
//filter先过滤姓张的 在过滤长度为三的 简洁高效 1行代码搞定
lists.stream().filter(s-> s.startsWith("张")).filter(s ->s.length()==3).forEach(s -> System.out.println(s));
}
}
哎呀 是不是比正常的思维的方法方便多了,一行代码就搞定了
下面介绍下 集合与数组获取流的方式:
直接上代码:
package Stream;
import java.util.*;
import java.util.stream.Stream;
public class StreamDemo02 {
public static void main(String[] args) {
//Stream 是来操作集合和数组
//介绍 Collection 集合获取流的方式
//很简单
Collection collection = new ArrayList();
collection.stream();
//1.Map集合获取流的方式
Map<String,Integer> maps = new HashMap<>();
maps.put("你好",6);
maps.put("hello",9);
//先获取set集合 再用set集合获取流
//就是先获取key键的流
Stream<String> key = maps.keySet().stream();
//获取值的流
Stream<Integer> values = maps.values().stream();
//2.同时获取键和值
Stream<Map.Entry<String, Integer>> keyValues = maps.entrySet().stream();
//数组获取流
// 1.通过数组工具类 Arrays
// 2.Stream.of(数组)
String[] str = new String[]{"你好","欢迎","来到java世界"};
Stream<String> strStream = Arrays.stream(str);
Stream<String> str1Stream = Stream.of(str);
strStream.filter(s -> s.length()==2).forEach(s-> System.out.println(s));
}
}
这些都是非常简单的基础
下面介绍流的常用API
/*
forEach : 逐一处理(遍历)
count:统计个数
-- long count();
filter : 过滤元素
-- Stream<T> filter(Predicate<? super T> predicate)
limit : 取前几个元素
skip : 跳过前几个
map : 加工方法
concat : 合并流
*/
这里面分终结方法和非终结方法
终结方法: foreach , count 一旦Stream调用了终结方法,流的操作就全部终结了,不能继续使用, 只能创建新的Stream操作
非终结方法:每次调用完成以后返回一个新的流对象,可以继续使用,支持链式编程!
代码:
package Stream;
import java.util.ArrayList;
import java.util.Collections;
import java.util.List;
import java.util.stream.Stream;
public class StreamDemo03 {
public static void main(String[] args) {
//Stream 常用的Api
/*
forEach : 逐一处理(遍历)
count:统计个数
-- long count();
filter : 过滤元素
-- Stream<T> filter(Predicate<? super T> predicate)
limit : 取前几个元素
skip : 跳过前几个
map : 加工方法
concat : 合并流
*/
List<String> lists = new ArrayList<>();
Collections.addAll(lists,"张无忌","张三丰","赵敏");
//过滤姓张的 且名字长度为三的 filter : 过滤元素
long count = lists.stream().filter(s -> s.startsWith("张")).filter(s -> s.length()==3).count();
System.out.println("姓张的,且名字长度为3的数量为:"+count);
System.out.println("---------------------------");
//取前两个 limit : 取前几个元素
lists.stream().limit(2).forEach(s -> System.out.println(s));
System.out.println("---------------------------");
//跳过前两个 skip : 跳过前几个
lists.stream().skip(2).forEach(s -> System.out.println(s));
System.out.println("---------------------------");
// 需求:在名字前面都加上 小说名 map : 加工方法
lists.stream().map(s -> "倚天屠龙记:"+s).forEach(System.out::println);//实例方法的引用
System.out.println("---------------------------");
//合并流 concat : 合并流
//数组流
Stream<Integer> s1 = Stream.of(12,24,36,20,40,60);
Stream<String> s2 = lists.stream();
Stream<Object> s3 = Stream.concat(s1, s2);
s3.forEach(System.out::println);
}
}
操作起来真的是非常简单的