Java8屌炸天的Stream用法

1.Stream简介

Stream 作为 Java 8 的一大亮点,它与 java.io 包里的 InputStream 和 OutputStream 是完全不同的概念。Java 8 中的 Stream 是对集合(Collection)对象功能的增强,它专注于对集合对象进行各种非常便利、高效的聚合操作(aggregate operation),或者大批量数据操作 (bulk data operation)。Stream API 借助于同样新出现的 Lambda 表达式,极大的提高编程效率和程序可读性。同时它提供串行和并行两种模式进行汇聚操作,并发模式能够充分利用多核处理器的优势,使用 fork/join 并行方式来拆分任务和加速处理过程。通常编写并行代码很难而且容易出错, 但使用 Stream API 无需编写一行多线程的代码,就可以很方便地写出高性能的并发程序。所以说,Java 8 中首次出现的 java.util.stream 是一个函数式语言+多核时代综合影响的产物。

2.何谓之Stream?

Stream 不是集合元素,它不是数据结构并不保存数据,它是有关算法和计算的,它更像一个高级版本的 Iterator。原始版本的 Iterator,用户只能显式地一个一个遍历元素并对其执行某些操作;高级版本的 Stream,用户只要给出需要对其包含的元素执行什么操作,比如 “过滤掉长度大于 10 的字符串”、“获取每个字符串的首字母”等,Stream 会隐式地在内部进行遍历,做出相应的数据转换。

3.Stream的用法收录

在java8之前,对于集合的循环遍历,排序,条件过滤等实现十分冗余及复杂,在java8后,将集合转成实现前面类似操作,就显得很简洁,代码看上去也清新了不少。

3.1 stream foreach
 String[] egs = {
    
    "hello", "world", "老张家的独苗"};
 Arrays.asList(egs).stream().forEach(s -> System.out.println(s));
3.2 stream filter

返回的流中只包含满足断言(predicate)的数据

  String[] egs = {
    
    "hello", "world", "老张家的独苗"};
  Arrays.asList(egs).stream().filter(s -> s.length() > 5).forEach(m -> System.out.println(m));
3.3 stream sort
  String[] egs = {
    
    "hello", "world", "老张家的独苗"};
  Arrays.asList(egs).stream().sorted((o1, o2) -> o1.compareTo(o2)).forEach(s-> System.out.println(s));
3.4 stream collect
  String[] egs = {
    
    "hello", "hello", "老张家的独苗"};
  Arrays.asList(egs).stream().collect(Collectors.toSet()).forEach(e -> System.out.println(e));
  Arrays.asList(egs).stream().collect(Collectors.toList()).forEach(e -> System.out.println(e));
3.5 stream map

方法将流中的元素映射成另外的值,新的值类型可以和原来的元素的类型不同

  String[] egs = {
    
    "hello", "world", "老张家的独苗"};
  Arrays.asList(egs).stream().map(e -> e.length()).forEach(s -> System.out.println(s.getClass()));
3.6 stream mapToDouble
 String[] egs = {
    
    "1", "211", "3"};
 double test = Arrays.asList(egs).stream().mapToDouble(s -> s.length()).max().orElse(0);
 System.out.println(test);
3.7 stream grouppingby
 Map<String, List<Student>> nameMap = tableDtlEntities.stream().collect(Collectors.groupingBy(Student::getName));
3.8 stream SummaryStatistics
 LongSummaryStatistics moneySummary= studentList.stream().collect(Collectors.summarizingLong(Student::getMoney));
3.9 stream distinct

保证输出的流中包含唯一的元素,它是通过Object.equals(Object)来检查是否包含相同的元素

Stream.of("a","b","c","b").distinct().collect(Collectors.toList()).forEach(s -> System.out.println(s));
3.10 stream reduce

reduce 操作可以实现从Stream中生成一个值,其生成的值不是随意的,而是根据指定的计算模型。比如,之前提到count、min和max方法,因为常用而被纳入标准库中。事实上,这些方法都是reduce操作

  Optional<Integer> total = Stream.of(1,2,3,4,5).reduce( (x, y) -> x * y);
  System.out.println(total.get());
  Integer total2 = Stream.of(1,2,3,4,5).reduce(0, (x, y) -> x +y);
  System.out.println(total2);

好了,java8的Stream就说到这呢,有兴趣的同学可以尝试把Stream用起来,用起来挺爽的!

猜你喜欢

转载自blog.csdn.net/zhangxing52077/article/details/108514293