Java 8 stream流 语法介绍 (3分钟学会使用stream)

这里不再介绍 stream 和 lamda表达式原理  旨在用最短的时间学会用stream流处理集合。 

 

stream原理深度解析: https://www.cnblogs.com/Dorae/p/7779246.html

 

使用流的流程可以简单为3步.

1.获取流

2.操作流 ( 有些操作不需要使用stream,如forEach sort)

3.聚合 (如果是遍历这种操作就不需要聚合)

 

1.获取流 

如果是 Collection对象,直接 .stream() 方法即可.如:

Stream stream = list.stream();

Stream parallelStream = list.parallelStream();  // 并行流

关于 Stream 和  ParallelStream  的区别可以自行搜索.  一句话概括:  

ParallelStream  会为每个cpu单独开一个线程,所以一般来说 ,在多核下速度比stream快,但是不保证元素处理顺序.

 

如果是 数组,则可以使用

Stream stream = Arrays.stream( T[] );

 

 

2.操作流

比较常用的操作 :  排序( sorted )遍历 ( forEach ),过滤( filter ),映射( map )

 


@Test

public void test2() throws Exception {



    List<String> list = new ArrayList<>();

    list.add("a");

    list.add("ab");

    list.add("abc");

    list.add("b");

    list.add("bc");

    list.sort( (a, b) -> a.length() - b.length());

    System.out.println(list);

}

 

 

sort里要求传入一个 实现了  Comparator 接口实例   我们可以观察一下  Comparator接口

 


@FunctionalInterface

public interface Comparator<T> {

    int compare(T o1, T o2);

}

重点: 他是一个 FunctionalInterface  ( 函数式接口).   有关函数式接口的介绍请看这里  https://blog.csdn.net/lz710117239/article/details/76192629

被@FunctionalInterface标注的接口是 函数式接口 ,它有且只有一个抽象方法,  函数式接口都可以使用lambda表达式来简化语法.

这里拿sort方法举例  有2个参数 o1, o2  对应了 


list.sort( (a, b) -> { return a.length() - b.length() ; } );   

list.sort( (a, b) -> a.length() - b.length());

  list.sort(  (a, b)  -> a.length() - b.length() );  注意: 这里你也可以写为 ( String a ,String b )  但是由于lambda自带的类型推倒,IDE或者编译器都能自动识别此处的a和b都是String对象.

 [    ] 是连参数和方法体的符号  如果 → 只有一句话 则可以省略 { } 和return  ,如下列代码.


下面看看 stream的filter方法  它要求传入一个  Predicate接口的实例  里面的抽象方法要求返回一个boolean值.

boolean test(T t);

因此我们可以写为

list.stream().filter( every -> every .length() > 2 );     // 这里的every指每一个元素 .


注: filter()的懒加载机制决定了 ,它不会对流做任何处理, 它的实际动作的取决于后续操作. 

 

map是相对来说复杂一些的函数, 它可以把一种stream映射为另外一种

但是根据之前的经验 我们也可以处理它

map方法要求传入一个 Function对象.  里面有一个抽象方法。

 

R apply(T t);

 

如:

List<String> list = new ArrayList<>();

Stream<Integer> integerStream = list.stream().map(every -> every.length() );

我们的list是一个 String类型的list  ,然而经过 map以后 变成了了  Integer  (实际是String对象的length( ) )

 

 

 

3. 聚合

聚合是相对来说比较难操作的一步, 不太熟悉的人可以通过大量练习来熟练 ,在此只举比较常用的2个例子

 

List<Integer> collect = list.stream().map(every -> every.length()).collect(Collectors.toList());  //直接聚合为list (元素已被映射为Integer)

  

Map<String, Integer> map = list.stream().collect(

        Collectors.toMap(   //toMap()要求传入2个Function实例

                Function.<String>identity(),  //如果用自身做key  则直接使用Function.<String>identity()

                item -> item.length())   // 用长度做value;



);

 

转载于:https://my.oschina.net/u/3777473/blog/1813759

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值