java基础之Stream流

一、使用Stream的目的:用于解决已有集合类库既有的弊端,只求关注【目的】,不关注【方式】,且其数据源:可以是集合,数组等

  例子:
public class NormalFilter {
public static void main(String[] args) {
    List<String> list = new ArrayList<>();
    list.add("张无忌");
    list.add("周芷若");
    list.add("赵敏");
    list.add("张强");
    list.add("张三丰");

    //过滤不是以“张”开头的元素
    List<String> listA = new ArrayList<>();
    for (String s : list) {
        if(s.startsWith("张")){
            listA.add(s);
        }
    }
    System.out.println("以张开头的数组:"+listA);
   
    //过滤元素长度等于3
    List<String> listB = new ArrayList<>();
    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<String> list = new ArrayList<>();
    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<String> list = new ArrayList<>();
                          Stream<String> listStream = list.stream();
            根据Map获取流:
                          Map<Integer,String> map = new HashMap<>();
                          Stream<Integer> keyStream = map.keySet().stream();
                          Stream<String> valuesStream = map.values().stream();
                          Stream<Map.Entry<Integer, String>> entryStream = map.entrySet().stream();
       b、Stream 接口的静态方法 of 可以获取数组对应的流
                          Stream<String> stream = Stream.of(array);

三、常用的方法

        逐一处理:forEach
              例子:
                    Stream<String> stringStream = Stream.of("张无忌", "张三丰", "周芷若");
                    stringStream.forEach(System.out::println);
       
        过滤:filter
        判断:Predicate接口
        映射:map---->需要将流中的元素映射到另一个流中
              例子:
                   Stream<String> stringStream = Stream.of("1", "2", "3", "4");
                      //使用map方法,把字符串类型的整数,(映射)为Interger类型的整数
                   Stream<Integer> integerStream = stringStream.map(Integer::parseInt);   
        
        取用前几个:limit--->方法可以对流进行截取,只取用前n个            
              例子:
                    Stream<String> stringStream = Stream.of("张无忌", "张三丰", "周芷若");
                    Stream<String> limitStream = stringStream.limit(2);
                    limitStream.forEach(System.out::println);

        合并:concat.....>如果有两个流,希望合并成为一个流

        例子:

                    Stream<String> streamA = Stream.of("张无忌");
                    Stream<String> streamB = Stream.of("张翠山");
                    Stream<String> result = Stream.concat(streamA, streamB);

四、方法引用

     例子:
          例如上例中, 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。两种写法的执行效果完全一样,而第二种方法引用的写法复用了已有方案,更加简洁。
posted @ 2020-08-14 18:05  jock_javaEE  阅读(139)  评论(0编辑  收藏  举报