Stream概念
代码示例
package com.zz.stream;
import java.util.ArrayList;
import java.util.Collections;
import java.util.List;
import java.util.stream.Collectors;
/**
* 使用Stream流
* 找出姓张并且是三个字的名字
*/
public class Test {
public static void main(String args[]){
List<String> names = new ArrayList <>();
Collections.addAll(names, "张无忌", "赵四", "张三", "李四", "张缘结");
System.out.println(names);
//使用原始方法
List<String> list = new ArrayList <>();
for (String name:names) {
if(name.startsWith("张") && name.length() == 3){
list.add(name);
}
}
System.out.println(list);
//使用Stream流
List<String> list1 = names.stream().filter(s -> s.startsWith("张")).filter(s -> s.length() == 3).collect(Collectors.toList());
System.out.println(list1);
}
}
-
names.stream(): 这部分将
names
列表转换成一个流(Stream)。流是Java 8中引入的一个新特性,它允许你以声明性方式处理数据集合(如列表、集合等)。 -
filter(s -> s.startsWith("张")): 第一个
filter
方法用于过滤流中的元素。它接受一个Predicate
(谓词),该谓词是一个函数式接口,用于定义一个测试条件。在这里,谓词是一个lambda表达式s -> s.startsWith("张")
,它检查每个字符串是否以“张”开头。只有满足这个条件的字符串才会被保留在流中。 -
filter(s -> s.length() == 3): 第二个
filter
方法再次过滤流中的元素。它使用了另一个lambda表达式s -> s.length() == 3
作为谓词,该谓词检查每个字符串的长度是否为3。只有长度为3的字符串才会被保留在流中。
需要注意的是,这里连续调用了两次filter
方法。流中的每个元素首先会经过第一个filter
方法的检查,然后再经过第二个filter
方法的检查。只有同时满足这两个条件的元素才会被保留。
- collect(Collectors.toList()): 最后,
collect
方法用于将过滤后的流收集到一个新的列表中。Collectors.toList()
是一个收集器(Collector),它告诉collect
方法如何收集流中的元素。在这个例子中,它将流中的元素收集到一个新的List
中。
Stream流的使用步骤
1.获取Stream流
-
List集合获取Stream流
-
Map集合获取Stream流
-
Set集合获取Stream流
-
数组获取Stream流
代码示例
package com.zz.stream;
import java.util.*;
import java.util.stream.Collectors;
import java.util.stream.Stream;
public class Test2 {
public static void main(String args[]){
//1.集合获取Stream流
List<String> names = new ArrayList <>();
Collections.addAll(names, "刘德华", "朱子晴", "朱德", "郭富城");
List<String> list = names.stream().filter(s -> s.contains("德")).collect(Collectors.toList());
System.out.println(list);
//2.Set集合获取Stream流
Set<String> set = new HashSet <>();
Collections.addAll(set, "刘德华", "朱子晴", "朱德", "郭富城");
Stream<String> stream = set.stream();
stream.filter(s -> s.contains("朱")).forEach(s -> System.out.println(s));
//使用Map集合获取Stream流
Map<String, Double> map = new HashMap <>();
map.put("白骨精", 145.9);
map.put("牛魔王", 180.3);
map.put("孙悟空", 156.4);
/**
* Map集合不能直接获取Stream流
* 解决方法
* 1.通过Set<String> keys = map.keySet();获取键流
* Collection<Double> values = map.values();获取值流
* 2.使用Entry封装键值对:Set<Map.Entry<String, Double>> entries = map.entrySet();
*/
Set<String> keys = map.keySet();
Stream<String> ks = keys.stream();//获取到键的流
Collection<Double> values = map.values();
Stream<Double> vs = values.stream();
Set<Map.Entry<String, Double>> entries = map.entrySet();
Stream<Map.Entry<String, Double>> kvs = entries.stream();
kvs.filter(e -> e.getKey().contains("牛")).forEach(s -> System.out.println(s.getKey() + "=" + s.getValue()));
//数组获取Stream流
String[] names2 = {"张护", "妞儿", "bab"};
Stream<String> s1 = Arrays.stream(names2);
Stream<String> s2 = Stream.of(names2);
}
}
2.Stream常用的中间方法
3.Stream流常见的终结方法
注意:流只能收集一次