JDK1.8 之Lambda

Posted 予我渡北川

tags:

篇首语:本文由小常识网(cha138.com)小编为大家整理,主要介绍了JDK1.8 之Lambda相关的知识,希望对你有一定的参考价值。

本文转载原文http://www.cnblogs.com/jalja/p/7655170.html

一、使用线程

public static void main(String[] args) {
        //=============================原始版==========================
        new Thread(new Runnable() {
            @Override
            public void run() {
                System.out.println("简单的线程编程JDK1.8以前");
            }
        }).start();
        //=====================Lambda可读性强一些================================
        new Thread(()->{System.out.println("Lambda可读性强一些");}).start();
        //=====================Lambda简洁一些================================
        new Thread(()->System.out.println("Lambda简洁一些")).start();
    }

Runnable接口源码:

@FunctionalInterface
public interface Runnable {
    public abstract void run();
}

该接口只有一个抽象方法,且该抽象没有参数 所以Lambda 表达式为 ();   System.out.println("简单的线程编程JDK1.8") 是实现该接口覆盖run方法的具体实现逻辑。所以最终Runnable接口的最终实现代码用Lambda表达式实现为:() -> System.out.println("简单的线程编程JDK1.8")。

 

二、使用  Collections.sort 排序

public static void testComparatorLambda(){
        List<Integer> names = Arrays.asList(1, 10, 3, 2,1);
        //=========================创建一个匿名的比较器对象=====================
        Collections.sort(names, new Comparator<Integer>() {
            @Override
            public int compare(Integer o1, Integer o2) {
                System.out.println("o1:"+o1+"<>o2:"+o2+"=="+o1.compareTo(o2));
                return o1.compareTo(o2);
            }
        });
        //==========================使用Lambda=================================
        Collections.sort(names,(Integer o1,Integer o2)->{
                        System.out.println("o1:"+o1+"<>o2:"+o2+"=="+o1.compareTo(o2));
                        return o1.compareTo(o2);
                      } );
        System.err.println(names);
    }
@FunctionalInterface
public interface Comparator<T> {
  int compare(T o1, T o2);
}

Compoarator接口的compare方法有两个参数 所以Lambda 表达式为 (Integer o1,Integer o2);   {System.out.println("o1:"+o1+"<>o2:"+o2+"=="+o1.compareTo(o2));return o1.compareTo(o2);} 是实现该接口覆盖compare方法的具体实现逻辑。所以最终Compoarator接口的最终实现代码用Lambda表达式实现为:(Integer o1,Integer o2)->{ System.out.println("o1:"+o1+"<>o2:"+o2+"=="+o1.compareTo(o2)); return o1.compareTo(o2);} 

 

三、自己模拟业务使用Lambda表达式实现

业务:从一堆苹果中选出红色的苹果。

建立一个苹果类

class Apple{
    private String color;
    private Integer weight;
    构造函数
    get,set
}

一个策略接口

interface AppleFilter{
    boolean validate(Apple apple);
}

业务实现:

public class LambdaAgo {
    public static void main(String[] args) {
        List<Apple> apples=Arrays.asList(new Apple("red",120),new Apple("green",189),new Apple("red",110));
        //===方法一 使用内部类======
        getAppleFilter(apples,new AppleFilter() {
            @Override
            public boolean validate(Apple apple) {
                return apple.getColor().equals("red");
            }
        });
        //===方法二 使用 Lambda======
        getAppleFilter(apples,(Apple apple)-> apple.getColor().equals("red"));
    
    }
    public static List<Apple> getAppleFilter(List<Apple> apples,AppleFilter filter){
        List<Apple> apples2=new ArrayList<Apple>();
        for(Apple a:apples){
            if(filter.validate(a)){
                apples2.add(a);
            }
        }
        System.out.println("getAppleFilter:"+apples2);
        return apples2;
    }
}

以上是关于JDK1.8 之Lambda的主要内容,如果未能解决你的问题,请参考以下文章

Jdk1.8新特性之Lambda表达式

jdk1.8新特性之lambda表达式及在Android Studio中的使用举例

JDK1.8新特性之--方法引用

JDK1.8新特性

JDK1.8新特性之--函数式接口

jdk1.8新特性Lambda表达式方法引用