Java笔记:lambda表达式

1.用lambda实现Runnable

new Thread( () -> sout("Lambda expression rocks!!") ).start();
等同于:
new Thread(new Runnable() {
    @Override
    public void run() {
    System.out.println("Java8之前的写法");
    }
}).start();

2.对列表进行迭代

list.forEach( n -> System.out.println(n); );
//--如果输出和参数相同,则可以省略参数
list.forEach( System.out:println; );

等同于:

for(n : list){
   System.out.println(n);
}

3.函数式接口Predicate

        可以向API添加逻辑,用更少的代码支持更多的动态行为。
      
 public void filter(String name,Predicate condition){
      if(condition.test(name)){
           sout(name+" ");
      }
}

        那么在调用时,我们就可以通过predicate来进行判断

4.Map和Reduce

1.map允许你将对象进行转换,将列表中的每个元素转换为修改之后的值。   

   eg:    List costBeforeTax = Arrays.asList(100, 200, 300, 400, 500);
            costBeforeTax.stream().map( (cost)->cost+.12*cost )
                                        .forEach(System.out::println);

2.reduce可以对所有值进行合并,比较类似SQL中的sum()、avg()、count()等

     eg:对修改后的数据进行计算,接收多个值,返回一个值

 costBeforeTax.stream().map( (cost)->cost+.12*cost ).reduce( (sum,cost)-> sum+cost).get();

5.filter过滤

        使用lambda表达式和流API过滤大规模数据集合,流提供了一个filter()方法,接受一个Predicate对象,即可以传入一个lambda表达式作为过滤逻辑
        eg:    List filtered = strList.stream().filter( x-> x.length()>10).collect(Collectors.toList);
            得到的结果为:过滤后的strList,长度都是大于10的

6.distinct()去重

        numbers.stream().distinct().collect(Collectors.toList);

7.集合的最大值、最小值、总和及平均值

        IntStream、LongStream和DoubleStream等流的类中,有个方法叫做summaryStatistics(),可以返回IntSummaryStatistics、LongSummaryStatistics或者DoubleSummaryStatistic
       
eg:    IntSumnumberList stats = numberList.stream().mapToInt((x)->x).summaryStatistics()
            stats存在    getMax、getMin、getSum、getAverage、getCount方法

8.Lambda表达式与匿名类

        this关键字:
            匿名类的this关键字指向匿名类
            lambda表达式的this关键字指向包围lambda表达式的类
        编译方式:
            java编译器将lambda表达式编译成类的私有方法,使用java7的invokedynamic字节码指令来动态绑定这个方法。

9.限制:

        1.lambda表达式只能引用final或final局部变量,即在lambda内部不能修改定义在域外的变量。

10.避免Null

        当出现多层嵌套时,调用其中的方法可能会抛出NullPointException异常,所以我们可以通过Optional类型来预防null检查
      
 eg:new Outer().getNested().getInner().getFoo()中可能会出现Null异常
            修改过后:
           
Optional.of(new Outer())
                    .map(Outer::getNested)
                    .map(Nested::getInner)
                    .map(Inner::getFoo)
                    .ifPresent(System.out::println);
注:以上由个人总结得出,如有雷同,那就雷同吧


你可能感兴趣的:(后端技术)