Stream流

1 阅读1分钟

常见操作

  • filter():筛选,返回符合条件的元素

  • map():映射,返回指定结果

  • collect():收集,返回结果

  • forEach():迭代,对集合中的元素进行迭代

  • reduce():归约,将集合中的元素进行归约为一个结果

Image text

demo

packagecom.jysemel.java.basic;importlombok.Data;@DatapublicclassUser{privateString name;privateInteger age;publicUser(String name,Integer age){this.name = name;this.age = age;}}

packagestream;importcom.jysemel.java.basic.User;importorg.junit.jupiter.api.Test;importjava.util.ArrayList;importjava.util.List;importjava.util.stream.Collectors;publicclassStreamDemo{@Testpublicvoiddd(){// 初始化用户列表List<User> userList =newArrayList<>();        userList.add(newUser("A",20));        userList.add(newUser("B",17));        userList.add(newUser("C",25));        userList.add(newUser("D",16));// Stream流方式:一站式完成筛选、转换、统计// 1. 筛选成年用户并提取姓名List<String> adultNames = userList.stream().filter(user -> user.getAge()>18)// 筛选条件:年龄>18.map(User::getName)// 提取姓名(方法引用).collect(Collectors.toList());// 转换为List// 2. 统计成年用户数量long adultCount = userList.stream().filter(user -> user.getAge()>18).count();// 直接统计数量// 3. 拼接姓名String nameStr =String.join(", ", adultNames);System.out.println("用户姓名:"+ nameStr);System.out.println("用户数量:"+ adultCount);}}

常见操作步骤

创建入口

从集合创建
List<String> list =Arrays.asList("a","b","c");Stream<String> stream = list.stream();// 顺序流Stream<String> parallelStream = list.parallelStream();// 并行流
从数组创建
// 使用 Arrays.stream()String[] array ={"a","b","c"};Stream<String> stream1 =Arrays.stream(array);Stream<String> stream2 =Arrays.stream(array,1,3);// 截取部分元素// 使用 Stream.of()Stream<String> stream3 =Stream.of(array);Stream<Integer> stream4 =Stream.of(1,2,3);// 直接传入元素
从文件创建
Path path =Paths.get("data.txt");try(Stream<String> lines =Files.lines(path)){    lines.forEach(System.out::println);}catch(IOException e){    e.printStackTrace();}
其他 API 创建
// 随机数流Random random =newRandom();IntStream randomInts = random.ints(5,10,100);// 510~99的随机数// BufferedReader 行流BufferedReader reader =newBufferedReader(newFileReader("file.txt"));Stream<String> lines = reader.lines();// 正则分割Pattern pattern =Pattern.compile(",");Stream<String> splitStream = pattern.splitAsStream("a,b,c");

中间流程

filter(过滤出满足条件的元素)
Stream<Integer> stream =Stream.of(1,2,3,4,5);stream.filter(n -> n %2==0)// 保留偶数.forEach(System.out::println);// 输出 2 4
distinct(去除重复元素)
Stream.of(1,2,2,3,3,4).distinct().forEach(System.out::print);// 1234
map(将元素映射为另一个元素)
Stream.of("a","b","c").map(String::toUpperCase).forEach(System.out::print);// ABC
limit(截取元素)
Stream.iterate(0, i -> i +1).limit(5).forEach(System.out::print);// 01234
sorted(排序)
Stream.of(3,1,4,1,5).sorted().forEach(System.out::print);// 11345Stream.of("aa","b","ccc").sorted(Comparator.comparingInt(String::length)).forEach(System.out::println);// b aa ccc

尾端操作

匹配与查找(返回布尔值或 Optional)

流中任意一个元素满足条件返回 true

boolean hasEven =Stream.of(1,2,3).anyMatch(n -> n %2==0);// true
归约(将流归约为一个值)
int sum =Stream.of(1,2,3).reduce(0,Integer::sum);// 6
收集(将流元素累积到容器中)
// 收集为 ListList<String> list =Stream.of("a","b","c").collect(Collectors.toList());// 收集为 SetSet<String> set =Stream.of("a","b","a").collect(Collectors.toSet());// 收集为 MapMap<Integer,String> map =Stream.of("a","bb","ccc").collect(Collectors.toMap(String::length,Function.identity(),(v1, v2)-> v1));// 连接字符串String joined =Stream.of("a","b","c").collect(Collectors.joining(", "));// "a, b, c"// 分组Map<Integer,List<String>> groupByLength =Stream.of("a","bb","c").collect(Collectors.groupingBy(String::length));// {1=["a","c"], 2=["bb"]}// 分区Map<Boolean,List<Integer>> partition =Stream.of(1,2,3,4).collect(Collectors.partitioningBy(n -> n %2==0));// {false=[1,3], true=[2,4]}
遍历(产生副作用)
Stream.of(1,2,3).forEach(System.out::println);// 可能乱序