`
干宝周
  • 浏览: 14270 次
社区版块
存档分类
最新评论

JDK8 里的 lambda使用

 
阅读更多

JDK8里最引人注意的,就是lambda表达式了。很有意思,也很简单的特性。

lambda表达式在别的语言里已经非常成熟了,解决的主要问题是程序员普遍“懒”的问题~

不说话,直接上代码吧。 跑完代码里的程序,也能知道lambda的使用了

 

public class LambdaExample {
    void foo() {
        List<Person> personList = new ArrayList<>();
        personList.add(new Person("Virat", "Kohli"));
        personList.add(new Person("Arun", "Kumar"));
        personList.add(new Person("Rajesh", "Mohan"));
        personList.add(new Person("Rahul", "Dravid"));

        // JDK8之前,使用匿名函数解决这个问题
Collections.sort(personList, new Comparator<Person>() {
            public int compare(Person p1, Person p2) {
                return p1.firstName.compareTo(p2.firstName);
            }
        });

        // JDK8 之后,可以用lambda表达式
Collections.sort(personList, (Person p1, Person p2) -> p1.firstName.compareTo(p2.firstName));

        /**
         * 新增的Function函数, Person是输入,String是输出
*/
Function<Person, String> wacb = a -> {
            return "kkdd" + "cc";
        };

        // 也可以不用"{}" 包含起来. 最后一行的结果,默认作为返回值
Function<Person, String> waca = a -> "kkdd" + "cc";

        // 遍历
for (Person person: personList) {
           // System.out.println(person);
System.out.println(person.printCustom(waca));
        }

        /**
         * 可以遍历
*/
personList.forEach(p->System.out.println(p.toString() + " kkkkaaa"));

        /**
         * Predicate用来进行集合过滤
*/
Predicate<Person> startsWithAPerson = p->p.firstName.startsWith("A");
        personList.forEach(p-> {
            if (startsWithAPerson.test(p)) {
                System.out.println("starts with A:" + p);
            }
        });

        /**
         * 如果只有一个方法,可以加上默认函数编程
*/
Runnable runner = () -> {
            System.out.println("I am lambda runner.");
        };
        runner.run();

        MyInterfaceA myInterface = (String s) -> {
            System.out.println(" I am in myInterface" + s);
        };

        MyInterfaceB myInterfaceB = () -> {
        };

        myInterface.a("kk");

        List<Person> ps = new ArrayList<>();
        Random r = new Random();
        for (int i=0; i<10;i++){
            ps.add(new Person("firstname"+i, "lastname"+i, r.nextInt(30) + 1));
        }
        // 过滤条件>18Predicate<Person> adults = p -> p.getAge() > 18;

        //最小年龄
OptionalInt minAge = ps.parallelStream().filter(adults)
          .mapToInt(p -> p.getAge()).min();
        System.out.println("最小年龄:" + minAge.getAsInt());

        // 18岁以上的平均值
OptionalDouble average =
          ps.parallelStream().filter(adults)
            .mapToDouble(p -> {
                return p.getAge();
            }).average();

        System.out.println("平均年龄:" + average.getAsDouble());

    }

    public static void main(String[] args) {
        new LambdaExample().foo();;
    }

    class Person {
        String firstName;
        String secondName;
        int age;

        Person(String f, String s) {
            this.firstName = f;
            this.secondName = s;
        }

        Person(String f, String s, int age) {
            this.firstName = f;
            this.secondName = s;
            this.age = age;
        }

        @Override
public String toString() {
            return "Person{" +
              "firstName='" + firstName + '\'' +
              ", secondName='" + secondName + '\'' +
              '}';
        }

        public int getAge() {
            return age;
        }

        public String printCustom(Function<Person, String> f) {
            return f.apply(this);
        }
    }

    // 理论上来说,当这个接口只有一个函数时,才可以用lambda函数
interface MyInterfaceA {
        void a(String a);
    }

    // 犹豫 bb 是默认函数
interface MyInterfaceB{
        void b();

        // default关键字,给接口带了默认实现
default void bb(String s) {
        }

        // 这种Object里默认的函数,也不会影响是否可以使用lambda函数
boolean equals(Object obj);
        String toString();
    }

    class ClassB implements  MyInterfaceB {
        @Override
public void b() {  }

        public void bb() {  }
    }
}
0
0
分享到:
评论

相关推荐

    Jdk 8 lambda 表达式使用示范

    java 8 新特性lambda表达式使用DEMO,怎么使用stream api 来操作集合,collect , fiter, foreach , map等等方法的使用示范

    JDK8特性(Lambda表达式+StreamAPI简单示例代码)

    JDK8特性(Lambda表达式+StreamAPI的简单使用示例代码)

    jdk8 新特性stream 和lambda表达式Demo

    jdk8 新特性stream 和lambda表达式Demo

    jdk1.8 Lambda表达式

    自已整理完全版最长用的lambda,基中包括lamnda介绍简答实体及多线程list,map相互转换等等。

    JDK8-Lambda-Course:关于JDK8中Lambda表达式的Oracle Online课程

    JDK8-Lambda-课程 关于JDK8中Lambda表达式的Oracle Online课程

    mac os jdk8

    与lambda联合使用,方法引用可以使语言的构造更紧凑简洁,减少冗余代码。 默认方法 − 默认方法就是一个在接口里面有了一个实现的方法。 新工具 − 新的编译工具,如:Nashorn引擎 jjs、 类依赖分析器jdeps。 Stream...

    jdk8-64-windows

    Java 8允许我们给接口添加一个非抽象的方法实现,只需要使用 default关键字即可。 新增lambda表达式 提供函数式接口 Java 8 允许你使用 :: 关键字来传递方法或者构造函数引用 我们可以直接在lambda表达式中访问外层...

    JDK8MOOC_Lesson_1:JDK 8 Lambda和Streams MOOC第1课作业

    JDK 8 Lambda和Streams MOOC:第1课作业在第1课中,我们将重点介绍使用Lambda表达式,方法引用以及已添加到现有类中的一些新方法。 您应该使用一个模板源文件来创建练习的答案,称为Lesson1.java。 为了简化操作,您...

    Windows JDK1.8下载 :jdk-8u281-windows-x64.zip

    1.Java 8允许我们给接口添加一个非抽象的方法实现,只需要使用 default关键字即可。 2.新增lambda表达式 3.提供函数式接口 4.Java 8 允许你使用关键字来传递方法或者构造函数引用 5.我们可以直接在lambda表达式中...

    java-study 是本人学习Java过程中记录的一些代码!从Java基础的数据类型、jdk1.8的Lambda、.zip

    java-study 是本人学习Java过程中记录的一些代码!从Java基础的数据类型、jdk1.8的Lambda、

    java-study 是本人学习Java过程中记录的一些代码!从Java基础的数据类型、jdk1.8的Lambda、10.zip

    java-study 是本人学习Java过程中记录的一些代码!从Java基础的数据类型、jdk1.8的Lambda、10

    JDK8+Java+常用版本

    jdk8虽然出现很久了,但是可能我们还是有很多人并不太熟悉,本文主要就是介绍说明一些jdk8相关的内容。 主要会讲解: lambda表达式 方法引用 默认方法 Stream 用Optional取代null 新的日志和时间 ...

    一文带你入门JDK8新特性——Lambda表达式

    主要介绍了JDK8新特性——Lambda表达式的相关资料,帮助大家更好的理解和学习JAVA开发,感兴趣的朋友可以了解下

    jdk8新特性demo

    jdk8新特性演示demo,主要包含lambda表达式的使用,方法引用的使用,stream流式操作的使用等演示demo,然后就么有了

    Java-JDK8新特性总结-接口方法/Lambda/方法引用/Optional

    使用场景:开发和面试题中都会用到,开发中合理运用Java 8新特性可以大大简化代码量,提高开发效率,在Java面试中JDK8新特性也是面试常问的热点题目,理解这些特性之后,很容易把它们说清楚,面试嘎嘎加分 ...

    jdk-8u261-windows-x64安装包

    Oracle甲骨文公司于2015年1月15日发布了新一版JDK8,新版本加入了许多新的特性。这些特性带来了一些改变,可以很大方便Java程序的编写。新特性主要涉及:对于JDK7中Fork/Join并行处理的升级;支持Lambda表达式;添加...

    国内常用jdk资源,jdk8资源

    Lambda 表达式也可称为闭包,是推动 Java 8 发布的最重要新特性。lambda表达式本质上是一个匿名方法。Lambda允许把函数作为一个方法的参数(函数作为参数传递进方法中)或者把代码看成数据。使用 Lambda 表达式可以...

    JDK8(JDK1.8).rar

    JDK8新特性 1、lambda表达式(重点) 2、函数式接口 3、方法引用与构造器引用 4、Stream API(重点) 5、接口中的默认方法和静态方法 6、新时间日期API 7、其他新特性 注意: JDK8或者JDK1.8是由于自从JDK1.5/JDK5...

    Java jdk8版本8u231

    Oracle 官网提供的jdk8的安装包 jdk8增加了Lambda 表达式 : Collections.sort(names, (String a, String b) -&gt; { return b.compareTo(a); });、 函数式接口 : converter = something::startsWith; ...

    Java JDK 1.8 lambda的用法详解

    主要介绍了Java JDK 1.8 lambda的用法详解,文中给大家提到了jdk 1.8 Lambda 表达式 遍历数组的方法,需要的朋友可以参考下

Global site tag (gtag.js) - Google Analytics