java8新特性Lambada,Steam流

一:lambda表达式

  其实就是实现接口的,实现接口可以创建类来实现,也可以直接用匿名内部类,lambda就是匿名函数。但是对接口是有要求的,接口的抽象方法只能有一个,这种接口叫做函数式接口,一般会用注解@FunctionalInterface 修饰。由三种符号组成。(), ->,{}方法体 。()里面就是接口抽象方法的参数。{} 里面写逻辑,抽象方法有返回类型的话这儿要return对应的类型。 

  简化规则:1 ()中参数的类型可以省略,参数如果只有一个,()可以省略。

       2  当方法体{}只有一句的时候 {} 可以省略不写,当这一句是return语句的话,要把return也去掉。

 

 

 

进阶:

   方法引用: 当接口的那个抽象方法在很多地方被引用的时候,会有很多重复的实现,可以写一个公共函数写进去。{}方法体就可以直接引用实现好的方法了。引用方法的参数类型 和返回类型要和接口中方法的参数类型 和返回类型要一致。

 

 

 构造方法引用:用类名 :: new 就行

 

 

 例子:

 list里面排序 用lambds就会很简单 

 

 

 

 

 

 还有用treeSet填写数据的时候比如添加对象时候无法判断大小的情况下 这种写法也会方便
 

 

 

 

 这样写会让重复的不被删除    

 

 

 list foreach遍历  

 

 

利用Stream流来遍历 下面的代码是便利后每个元素都加上自己乘0.12。其实也是把一个list放到另一个集合中

import java.util.Arrays;
import java.util.List;
import java.util.stream.Collectors;

public class Test3 {
    public static void main(String[] args) {
        List<Integer> list = Arrays.asList(100,200,300,400);
        //stream()把集合转成了流
        //map(方法), 把流里面的每个元素都执行一些
        //map里面的方法,转换了一下。
        //collect(Collectors.toList()) 把转换以后的元素
        //收集起来放到一个新的list里面
        List ls=   list.stream().map((cost)->cost + cost * .12).collect(Collectors.toList());
        //遍历集合costBeforeTax,并且打印里面的元素
        ls.forEach(a->System.out.println(a));
    }
}

 一般把一个集合数据放到另一个集合。

package cn.test;

import java.util.ArrayList;
import java.util.Arrays;
import java.util.List;

public class Test {
    public static void main(String[] args) {
        List<Integer> list2 = new ArrayList<>();
        List<Integer> list = Arrays.asList(100, 120);
        list.forEach(a -> {
            list2.add(a + 10);
        });
        list2.forEach(System.out::println);

    }


}

 

还有一种情况是把满足条件的的放到另一个集合  用Steam流来写 用filter. 后面的值就是判断值

package cn.test;

import java.util.Arrays;
import java.util.List;
import java.util.stream.Collectors;

public class Test {
    public static void main(String[] args) {

        List<Integer> list = Arrays.asList(100, 120);
        List ls=   list.stream().filter((cost)->cost==100).collect(Collectors.toList());
        ls.forEach(System.out::println);

    }


}

结果为 100哈

当然也可以结合起来用,结果就是返回200了

package cn.test;

import java.util.Arrays;
import java.util.List;
import java.util.stream.Collectors;

public class Test {
    public static void main(String[] args) {

        List<Integer> list = Arrays.asList(100, 120);
        List ls=   list.stream().map((cost)->cost+100).filter(a->a==200).collect(Collectors.toList());
        ls.forEach(System.out::println);

    }


}
package cn.test;

import java.util.Arrays;
import java.util.List;
import java.util.Objects;
import java.util.stream.Collectors;

public class Test {
    public static void main(String[] args) {

        List<Integer> list = Arrays.asList(100, 120);
        List ls=   list.stream().map((cost)->cost+100).filter(Objects::nonNull).collect(Collectors.toList());
        ls.forEach(System.out::println);

    }


}

 

 

 

lsit 删除元素

 

 

 

系统内置函数接口

如 removeif中的 Predicate接口   foreach中的Consumer接口


    

 

 


  

posted @ 2020-04-29 17:59  nkk  阅读(317)  评论(0编辑  收藏  举报