Java 8 引入了Stream流的操作,让我们在开发的过程中感受到了很多的便利,小宋我也花时间总结了下关于Stream的堪称最全的使用方法,话不多说,直接放大招。 流(stream)的类型 Java 8提供了两种方式去创建流: 1、str
Java 8 引入了Stream流的操作,让我们在开发的过程中感受到了很多的便利,小宋我也花时间总结了下关于Stream的堪称最全的使用方法,话不多说,直接放大招。
Java 8提供了两种方式去创建流:
stream是串行的,可以理解为它的执行是按顺序执行的。
parallelStream是并行的,可以理解为它的执行不是按顺序执行的,它的原理采用了分治的原理去实现,可以点击查看Fork/Join,我就不多做解释啦,并行是为了充分利用CPU的性能,如果CPU不太行的话,还是不用吧,并行执行会有不确定性,而且不是线程安全的,大家用的时候要多注意了。
方法 | 举例 |
---|---|
Collection的stream()方法或者parallelStream() | Arrays.asList(1,2,3).stream() |
使用流的静态方法 | 比如Stream.of(Object[]), IntStream.range(int, int) 或者 Stream.iterate(Object, UnaryOperator),如Stream.iterate(0, n -> n * 2),或者generate(Supplier s)如Stream.generate(Math::random)。 |
从文件中获得行的流 | BufferedReader.lines() |
Files类的操作路径的方法 | 如list、find、walk等 |
随机数流 | Random.ints() |
Arrays.stream(Object[])方法 | Arrays.stream(new int[]{1,2,3}) |
其它一些类提供了创建流的方法 | 如BitSet.stream(),Pattern.splitAsStream(java.lang.CharSequence), 和 jarFile.stream() |
map是stream中非常常用的一个方法,它用于映射每个元素到对应的结果里面,可以让你提取对象中的某一个属性或者转化成其它的对象,下面有几个例子可以用作参考。
List<Integer> numbers = Arrays.asList(3, 2, 2, 3, 7, 3, 5);List<Integer> squaresList = numbers.stream().map( i -> i*i).distinct().collect(Collectors.toList());System.out.println(squaresList);//输出结果:[9, 4, 49, 25] 其中distinct()是去掉重复的值。
首先定义两个对象,如下
@Datapublic class StaffPublic { private String name;//名称 private Integer age;//年龄 private String extra;//额外信息 public Staff(String name, Integer age, String extra) { this.name = name; this.age = age; this.extra= extra; }}
@Datapublic class Staff { private String name;//名称 private Integer age;//年龄 private String sex;//性别 public Staff(String name, Integer age, String sex) { this.name = name; this.age = age; this.sex = sex; }}
List<Staff> staff = new ArrayList<>();staff.add(new Staff("ricky",30,"man"));staff.add(new Staff("jack",27,"man"));staff.add(new Staff("lawrence",33,"woman"));List<String> collect = staff.stream().map(x -> x.getName()).collect(Collectors.toList());System.out.println(collect); //输出 [ricky, jack, lawrence]
List<StaffPublic> result = staff.stream().map(temp -> { StaffPublic obj = new StaffPublic(); obj.setName(temp.getName()); obj.setAge(temp.getAge()); if ("ricky".equals(temp.getName())) { obj.setExtra("this field is for ricky only!"); } return obj; }).collect(Collectors.toList());System.out.println(result);//输出[ StaffPublic{name='ricky', age=30, extra='this field is for ricky only!'}, StaffPublic{name='jack', age=27, extra='null'}, StaffPublic{name='lawrence', age=33, extra='null'}]
filter 主要用于通过设置的条件过滤出符合的元素,类似于一个过滤器。
List<String>strings = Arrays.asList("abc", "", "bc", "efg", "abcd","", "jkl");// 获取空字符串的数量long count = strings.stream().filter(string -> string.isEmpty()).count();// 输出结果:2
List<StudentInfo> studentList = new ArrayList<>();studentList.add(new StudentInfo("李小明",true,18,1.76,LocalDate.of(2001,3,23)));studentList.add(new StudentInfo("张小丽",false,18,1.61,LocalDate.of(2001,6,3)));studentList.add(new StudentInfo("王大朋",true,19,1.82,LocalDate.of(2000,3,11)));studentList.add(new StudentInfo("陈小跑",false,17,1.67,LocalDate.of(2002,10,18)));List<StudentInfo> boys = studentList.stream().filter(s->s.getGender() && s.getHeight() >= 1.8).collect(Collectors.toList());StudentInfo.printStudents(boys);// 输出 "王大朋",true,19,1.82,2002-10-18 gender解释 false代表女生 true代表男生
limit 对一个Stream进行截断操作,获取其前N个元素。如果原Stream中包含的元素个数小于N,那就获取其所有的元素,这是一个short-circuiting 操作。
Random random = new Random();random.ints().limit(3).forEach(System.out::println);// 输出结果93148391-108910530-654413184
List<String> strings = Arrays.asList("abc", "dd", "bc", "efg", "abcd","cc", "jkl");strings.stream().limit(2).forEach(System.out::println);//输出 abc dd
skip 可以对流进行一个跳过操作,可以通过自定义的数值N去跳过前N个元素。
List<String>strings = Arrays.asList("abc", "dd", "bc", "efg", "abcd","cc", "jkl");strings.stream().skip(3).forEach(System.out::println);// 输出结果efgabcdccjkl
distinct 是对流进行一个去重的操作,是通过元素的hashcode()和equals()去判断两个元素是否一致的,这样我们在使用对象去重的时候,可以通过重写它的hascode和equals方法就可以达到我们想要的效果了。
List<String>strings = Arrays.asList("abc", "dd", "bc", "abc", "bc","cc", "dd");strings.stream().distinct().forEach(System.out::println);// 输出结果abcddbccc
peek 生成一个包含原Stream的所有元素的新Stream,同时会提供一个消费函数(Consumer实例),新Stream每个元素被消费的时候都会执行给定的消费函数,peek主要被用在debug用途。
Stream.of("one", "two", "three","four").filter(e -> e.length() > 3) .peek(e -> System.out.println("Filtered value: " + e)) .map(String::toUpperCase) .peek(e -> System.out.println("Mapped value: " + e)) .collect(Collectors.toList());//输出Filtered value: threeMapped value: THREEFiltered value: fourMapped value: FOUR
sorted 是对流进行一个排序操作。
List<String> list = Arrays.asList("cc","aa","dd","bb"); list.stream().sorted().forEach(System.out::println);//输出aabbccdd
List<String> list = Arrays.asList("cc","aa","dd","bb"); list.stream().sorted(Comparator.reverseOrder()).forEach(System.out::println);//输出ddccbbaa
@Data@AllArgsConstructorpublic class Employee { private String name; private Integer age;}// 初始化参数List<Employee> list = new ArrayList<>(); list.add(new Employee("张三",33)); list.add(new Employee("李四",28)); list.add(new Employee("王五",25)); list.add(new Employee("赵六",40)); list.add(new Employee("孙七",18));
list.stream().sorted(Comparator.comparingInt(Employee::getAge)).forEach(System.out::println);// 输出Employee(name=孙七, age=18)Employee(name=王五, age=25)Employee(name=李四, age=28)Employee(name=张三, age=33)Employee(name=赵六, age=40)
list.stream().sorted(Comparator.comparingInt(Employee::getAge).reversed()).forEach(System.out::println);//输出Employee(name=赵六, age=40)Employee(name=张三, age=33)Employee(name=李四, age=28)Employee(name=王五, age=25)Employee(name=孙七, age=18)
collect 方法的功能是将 Stream 中数据转换为最终的结果
List list= Arrays.asList("a", "b", "c", "d");List collect =list.stream().map(String::toUpperCase).collect(Collectors.toList());System.out.println(collect); //输出[A, B, C, D]数组所有元素,按某种规律计算:List num = Arrays.asList(1,2,3,4,5);List collect1 = num.stream().map(n -> n * 2).collect(Collectors.toList());System.out.println(collect1); //输出[2, 4, 6, 8, 10]
Stream<String> stream = Stream.of("hello", "world", "helloworld");//转成ArrayListArrayList<String> list = stream.collect(Collectors.toCollection(ArrayList::new));//转成TreeSetTreeSet<String> treeSet = stream.collect(Collectors.toCollection(TreeSet::new));
Stream<String> stream = Stream.of("hello", "world", "helloworld"); String s = stream.collect(Collectors.joining(",")); System.out.println(s);//输出hello,world,helloworld
List<Employee> list = new ArrayList<>();list.add(new Employee("张三", 33));list.add(new Employee("李四", 28));list.add(new Employee("王五", 25));list.add(new Employee("赵六", 40));list.add(new Employee("孙七", 18));String nameList = list.stream().collect(Collectors.mapping(Employee::getName, Collectors.joining(",")));System.out.println(nameList);//输出结果张三,李四,王五,赵六,孙七
Employee employee = list.stream().collect(Collectors.minBy(Comparator.comparingInt(Employee::getAge))).get();System.out.println(employee);//输出结果Employee(name=孙七, age=18)
Employee employee = list.stream().collect(Collectors.minBy(Comparator.comparingInt(Employee::getAge))).get();System.out.println(employee);//输出结果Employee(name=赵六, age=40)
long sum = list.stream().collect(Collectors.summarizingInt(Employee::getAge)).getSum();System.out.println(sum);//输出结果144
Double avgAge = list.stream().collect(Collectors.averagingInt(Employee::getAge));System.out.println(avgAge);//输出结果28.8
List<Employee> list = new ArrayList<>();list.add(new Employee("张三", 20));list.add(new Employee("李四", 20));list.add(new Employee("王五", 30));list.add(new Employee("赵六", 30));list.add(new Employee("孙七", 40));Map<Integer, List<Employee>> employeeMap = list.stream().collect(Collectors.groupingBy(Employee::getAge));for (Integer age : employeeMap.keySet()) { System.out.println(age+"年龄组有"); employeeMap.get(age).stream().forEach(System.out::println);}//输出结果20年龄组有Employee(name=张三, age=20)Employee(name=李四, age=20)40年龄组有Employee(name=孙七, age=40)30年龄组有Employee(name=王五, age=30)Employee(name=赵六, age=30)
List<Employee> list = new ArrayList<>();list.add(new Employee("张三", 33));list.add(new Employee("李四", 28));list.add(new Employee("王五", 25));list.add(new Employee("赵六", 40));list.add(new Employee("孙七", 18));//年龄是否大于30Map<Boolean, List<Employee>> employeeMap = list.stream().collect(Collectors.partitioningBy(k -> k.getAge().compareTo(30) > 0));for (Boolean b : employeeMap.keySet()) { System.out.println(b ? "大于30的有" : "小于30的有"); employeeMap.get(b).stream().forEach(System.out::println);}//输出结果小于30的有Employee(name=李四, age=28)Employee(name=王五, age=25)Employee(name=孙七, age=18)大于30的有Employee(name=张三, age=33)Employee(name=赵六, age=40)
List<Employee> list = new ArrayList<>();list.add(new Employee("张三", 33));list.add(new Employee("李四", 28));list.add(new Employee("王五", 25));list.add(new Employee("赵六", 40));list.add(new Employee("孙七", 18));//年龄是否大于30Map<String, Employee> employeeMap = list.stream().collect(Collectors.toMap(k -> k.getName(), v -> v, (o1, o2) -> o1));for (String name : employeeMap.keySet()) { System.out.println(name + "年龄是:" + employeeMap.get(name).getAge() + "岁");}//输出结果孙七年龄是:18岁李四年龄是:28岁张三年龄是:33岁王五年龄是:25岁赵六年龄是:40岁
迭代流中的每一个数据,等同于for循环
Random random = new Random();random.ints().limit(10).forEach(System.out::println);List<String> items = Arrays.asList("a","b","c","d","e");items.forEach(item->System.out.println(item));//输出 a,b,c,d,e
List<String> strings = Arrays.asList("abc", "dd", "DD", "dd", "abcd","cc", "jkl");String result = strings.stream().filter(str -> str.equals("dd")) .findAny() .orElse(null);System.out.println(result);//输出 dd
List<String> strings = Arrays.asList("abc", "dd", "DD", "dd", "abcd","cc", "jkl");String result = strings.stream().filter(str -> str.equals("dd")) .findFirst() .orElse(null);System.out.println(result);//输出 dd
List<String> strings = Arrays.asList("abc", "dd", "DD", "dd", "abcd","cc", "jkl");Boolean result = strings.stream().anyMatch(str -> str.equals("dd"));System.out.println(result);//输出 true
List<String> strings = Arrays.asList("abc", "dd", "DD", "dd", "abcd","cc", "jkl");Boolean result = strings.stream().allMatch(str -> str.equals("dd"));System.out.println(result);//输出 false
List<String> strings = Arrays.asList("abc", "dd", "DD", "dd", "abcd","cc", "jkl");Boolean result = strings.stream().noneMatch(str -> str.equals("ff"));System.out.println(result);//输出 true
它可以把一个Stream的所有元素按照聚合函数聚合成一个结果
// 0代表初始值 如果不传0 则使用第一个元素作为初始值,acc是计算值,n 是每个元素int sum = Stream.of(1, 2, 3, 4, 5, 6, 7, 8, 9).reduce(0, (acc, n) -> acc + n);System.out.println(sum); // 45//不传初始值的情况下,返回的是Optional类型的结果List<Integer> numList = Arrays.asList(1,2,3,4,5);Optional<Integer> result = numList.stream().reduce((a, b) -> a + b);System.out.println(result.get());
来源地址:https://blog.csdn.net/u012062957/article/details/126106571
--结束END--
本文标题: Java Stream 最全操作用法合集
本文链接: https://www.lsjlt.com/news/377686.html(转载时请注明来源链接)
有问题或投稿请发送至: 邮箱/279061341@qq.com QQ/279061341
下载Word文档到电脑,方便收藏和打印~
2024-04-01
2024-04-03
2024-04-03
2024-01-21
2024-01-21
2024-01-21
2024-01-21
2023-12-23
回答
回答
回答
回答
回答
回答
回答
回答
回答
回答
0