java8新特性之函数式编程(lambda)

为什么要用lambda表达式?
1.java中普通命令式编程参数的传入和返回只能是值或者是对象的引用,我们无法将一个函数作为参数的方法,也无法声明返回一个函数的方法。
2.由于python语言受欢迎程度呈线性增长,函数式编程也得到了业界的肯定。
总结以上两点,java8中添加了一些新的特性,这是java有史以来版本改动中最大的一次,其中在保证了传统命令式编程风格的基础上,增加了函数式编程风格,lambda表达式便能在方法中的参数和返回值上传入和返回一个函数的方法。

  • lambda表达式的语法:
1.无参且方法体只有一句时,可以省略{}
() -> System.out.println("语法1")

2.有参且方法体只有一句时,可以省略{}
(param) -> System.out.println("语法1")

3.有参且方法体多句时
(param1,param2) -> {
	System.out.println(param1);
	System.out.println(param2);
}
...
  • 匿名内部类:
1.Thread:
new Thread(new Runnable() {
            @Override
            public void run() {
                System.out.println("命令式");
            }
        }).start();

new Thread(() -> System.out.println("函数式")).start();

2.Comparator:
List<String> list = Arrays.asList("zs","ls","ww");
//命令式:
Collections.sort(list, new Comparator<String>() {
  @Override
   public int compare(String o1, String o2) {
       return o1.compareTo(o2);
   }
});
//函数式1
Collections.sort(list,(a,z)->a.compareTo(z));
//函数式2
Collections.sort(list, String::compareTo);
  • forEach:
List<Integer> list= Arrays.asList(1,2,3,4,5,6);
//命令式:如下也是匿名内部类,Consumer接口是java中内置的函数式接口
list.forEach(new Consumer<Integer>() {
	@Override
	public void accept(Integer integer) {
    	System.out.println(integer);
	}
});
//函数式
list.forEach(i -> System.out.println(i));

其实lambda表达式就是重写了接口中方法的一个对象

  • . 函数式接口

    1. 自定义函数式接口

      @FunctionalInterface
      interface test{
          void mytest();
          String toString();
      }
      

      lambda表达式必须依赖于函数式接口,则函数式接口中有且只能存在一个抽象方法(重写Object的方法除外)。接口上添加@FunctionalInterface表明此接口是函数式接口(也可以不加此注解,java会通过上下文来进行推断,但必须保证抽象方法只能存在一个)

    2. 四大内置函数式接口

      • Consumer:消费型接口

        /**
        * Consumer<T>:消费型接口
         *      void accept(T t);一参无返回值
         */
        @Test
        public void test01(){
            eat(1000,e -> System.out.println("小明吃饭,消费"+e+"元"));
        }
        public void eat(double money, Consumer<Double> consumer){
            consumer.accept(money);
        }
        
      • Supplier:供给型接口

        /**
          * Supplier<T>:供给型接口
          *      T get();无参有返回值
          */
         @Test
         public void test02(){
             List<Integer> list = getNumList(10, () -> (int) (Math.random() * 100));
             list.forEach(i -> System.out.println(i));
         }
        
         public List<Integer> getNumList(int num, Supplier<Integer> supplier){
             List<Integer> list = new ArrayList<>();
             for (int i = 0; i < num; i++) {
                 Integer integer = supplier.get();
                 list.add(integer);
             }
             return list;
         }
        

猜你喜欢

转载自blog.csdn.net/qq_26869339/article/details/88096126