java8新特性

1.lanbda表达式

它允许我们将函数当成参数传递给某个方法,或者把代码本身当作数据处理。
最简单的Lambda表达式可由逗号分隔的参数列表、->符号和语句块组成,例如:

Arrays.asList( "a", "b", "d" ).forEach( e -> System.out.println( e ) );

在上面这个代码中的参数e的类型是由编译器推理得出的,你也可以显式指定该参数的类型,例如:

Arrays.asList( "a", "b", "d" ).forEach( ( String e ) -> System.out.println( e ) );

如果Lambda表达式需要更复杂的语句块,则可以使用花括号将该语句块括起来,类似于Java中的函数体,例如:

Arrays.asList( "a", "b", "d" ).forEach( e -> {
    System.out.print( e );
    System.out.print( e );
} );

Lambda表达式可以引用类成员和局部变量(会将这些变量隐式得转换成final的),例如下列两个代码块的效果完全相同:

String separator = ",";
Arrays.asList( "a", "b", "d" ).forEach( 
    ( String e ) -> System.out.print( e + separator ) );

final String separator = ",";
Arrays.asList( "a", "b", "d" ).forEach( 
    ( String e ) -> System.out.print( e + separator ) );

Lambda表达式有返回值,返回值的类型也由编译器推理得出。如果Lambda表达式中的语句块只有一行,则可以不用使用return语句,下列两个代码片段效果相同:

Arrays.asList( "a", "b", "d" ).sort( ( e1, e2 ) -> e1.compareTo( e2 ) );

Arrays.asList( "a", "b", "d" ).sort( ( e1, e2 ) -> {
    int result = e1.compareTo( e2 );
    return result;
} );

首先我们来比较一下比较简单的sort。
对于Array的sort:
Arrays.sort()只能对基础类型数组进行升序排序!!
Arrays.sort()可以对String或User类等进行自定义排序。

public static void main(String[] args) throws Exception {
        List<String> list = new ArrayList<String>();
        list.add("a");
        list.add("c");
        list.add("b");
        list.add("d");
        list.sort( ( e1, e2 ) -> e1.compareTo( e2 ) );
        System.out.println(list);//[a, b, c, d]
    }

Stream流

注意:

Stream只是一个计算通道,自己不会存储元素;

Stream不会改变源对象,相反,他们会返回一个新的Stream对象。

Stream操作是延时的,只有在执行终止操作时才会执行。

参考:https://blog.csdn.net/caishi13202/article/details/82631779
创建流: .stream()
list.stream() 顺序流
list.parallelStream() 并行流
Stream.of(“1”,“2”,3,new String[]{“a”, “b”, “c”}) 创建流,可以接受任意值
Stream.iterate(0, (x) -> x + 2) 无限流
Stream.generate(() -> 1) 无限流
Stream.iterate(0, (x) -> x + 2).limit(50) 终止操作,如limit来从0开始获取前50个偶数

boolean anyMatch(Predicate<? super T> predicate); anyMatch表示,判断的条件里,任意一个元素成功,返回true
boolean allMatch(Predicate<? super T> predicate); allMatch表示,判断条件里的元素,所有的都是,返回true
boolean noneMatch(Predicate<? super T> predicate);noneMatch跟allMatch相反,判断条件里的元素,所有的都不是,返回true

中间操作:筛选与切片
filter(Predicate d) 接受一个断言型函数,对Stream流中的元素进行处理,过滤掉不满足条件的元素
distinct 筛选元素,通过Stream元素中的hasCode和equals方法来去除重复元素
limit(long maxSize) 截断流,使元素不超过manSize指定的数量
skip(Long n) 跳过元素,返回一个扔掉了前n个元素的流,若流中的元素不足n个,则会返回一个空流

中间操作:映射
map(Function f) 接受一个函数型接口作为参数,该函数会对流中的每个元素进行处理,返回处理后的流
mapToDouble(ToDoubleFunction f) 接口一个函数型接口作为参数,该函数会对流中的每个元素进行处理,并返回一个Double值,最终得到一个Stream
mapToInt(ToIntFunction f) 接口一个函数型接口作为参数,该函数会对流中的每个元素进行处理,并返回一个Int值,最终得到一个Stream
mapToLong(ToLongFunction f) 接口一个函数型接口作为参数,该函数会对流中的每个元素进行处理,并返回一个Long值,最终得到一个Stream
flatMap(Function f) 接受一个函数作为参数,将流中的每个值都转换成一个新流,最后再将这些流连接到一起

中间操作:排序
sorted 返回一个新流,流中的元素按照自然排序进行排序 sorted(Comparator comp) 返回一个新流,并且Comparator指定的排序方式进行排序

终止操作:查找与匹配
allMatch(Predicate p) 传入一个断言型函数,对流中所有的元素进行判断,如果都满足返回true,否则返回false。
anyMatch(Predicate p) 传入一个断言型函数,对流中所有的元素进行判断,只要有一个满足条件就返回true,都不满足返回false。
noneMatch(Predicate p) 所有条件都不满足,返回true,否则返回false。
findFirst() 返回流中的第一个元素。
findAny() 返回流中的任意一个元素。
count() 返回流中元素的个数。
max(Comparator c) 按照给定的排序规则进行排序后,返回流中最大值的元素
min(Comparator c) 按照给定的排序规则进行排序后,返回流中最小值的元素
forEach(Consumer c) 内部迭代。

终止操作:规约
reduce(T iden, BinaryOperator bo) 可以将流中的元素反复结合起来,得到一个值,返回T
reduce(BinaryOperator bo) 可以将流中的元素反复结合起来,得到一个值,返回Optional。(Optional我们后面再聊)

终止操作:收集
collect(Collector c) 将流中的元素转换成其他形式,接受一个Collector接口的实现,用于处理Stream流中的元素,将流转换成其他形式的对象。
collector接口中方法的实现决定了如何对流执行收集操作(如收集到List,Set,Map)。java8中的Collectors类提供了很多静态方法,可以非常方便的创建常用的收集器实例,

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值