java基础之Stream流
一、使用Stream的目的:用于解决已有集合类库既有的弊端,只求关注【目的】,不关注【方式】,且其数据源:可以是集合,数组等
例子:
public class NormalFilter {
public static void main(String[] args) {
List
list.add("张无忌");
list.add("周芷若");
list.add("赵敏");
list.add("张强");
list.add("张三丰");
//过滤不是以“张”开头的元素
List
for (String s : list) {
if(s.startsWith("张")){
listA.add(s);
}
}
System.out.println("以张开头的数组:"+listA);
//过滤元素长度等于3
List
for (String s : listA) {
if(s.length()==3){
listB.add(s);
}
}
System.out.println("元素长度为:"+listB);
}
}
使用Stream简化代码
public class NormalFilter1 {
public static void main(String[] args) {
List
list.add("张无忌");
list.add("周芷若");
list.add("赵敏");
list.add("张强");
list.add("张三丰");
list.stream()
.filter(name->name.startsWith("张"))
.filter(name->name.length()==3)
.forEach(System.out::println);//name-> System.out.println(name)
}
}
二、获取Stream流方式
a、所有的 Collection 集合都可以通过 stream 默认方法获取流
根据Collection获取流:
List
Stream
根据Map获取流:
Map<Integer,String> map = new HashMap<>();
Stream
Stream
Stream<Map.Entry<Integer, String>> entryStream = map.entrySet().stream();
b、Stream 接口的静态方法 of 可以获取数组对应的流
Stream
三、常用的方法
逐一处理:forEach
例子:
Stream
stringStream.forEach(System.out::println);
过滤:filter
判断:Predicate接口
映射:map---->需要将流中的元素映射到另一个流中
例子:
Stream
//使用map方法,把字符串类型的整数,(映射)为Interger类型的整数
Stream
取用前几个:limit--->方法可以对流进行截取,只取用前n个
例子:
Stream
Stream
limitStream.forEach(System.out::println);
合并:concat.....>如果有两个流,希望合并成为一个流
例子:
Stream
Stream
Stream
四、方法引用
例子:
例如上例中, System.out 对象中有一个重载的 println(String) 方法恰好就是我们所需要的。那么对于printString 方法的函数式接口参数,对比下面两种写法,完全等效:
Lambda表达式写法: System.out.println(stringStream.max((x,y)->Integer.compare(x,y)).get());
方法引用写法:System.out.println(stringStream.max(Integer::compare).get());
第一种语义是指:拿到参数之后经Lambda之手,继而传递给 System.out.println 方法去处理。
第二种等效写法的语义是指:直接让 System.out 中的 println 方法来取代Lambda。两种写法的执行效果完全一样,而第二种方法引用的写法复用了已有方案,更加简洁。

浙公网安备 33010602011771号