JDK新特性

本文介绍了Java8的关键特性之一——Lambda表达式,包括其简介、语法、参数类型推断以及从匿名类到Lambda的转换示例,展示了Lambda如何简化代码并提升Java语言的表达能力。
摘要由CSDN通过智能技术生成

1 Java 8 新特性简介

Java 8 (又称为 jdk 1.8) 是 Java 语言开发的一个主要版本。Java 8 是oracle公司于2014年3月发布,可以看成是自Java 5 以来最具革命性的版本。 Java 8为Java语言、编译器、类库、开发工具与JVM带来了大量新特性。
在这里插入图片描述

2 Lambda表达式

2.1 简介

Lambda 是一个匿名函数,我们可以把 Lambda 表达式理解为是一段可以传递的代码(将代码像数据一样进行传递)。使用它可以写出更简洁、更灵活的代码。作为一种更紧凑的代码风格,使Java的语言表达能力得到了提升
从匿名类到 Lambda 的转换举例1 :

public class LamdbaDemo2 {

    /**
     * junit主线程结束,会结束所有子线程
     * @param args
     */
    public static void main(String[] args) {

//        Runnable myTask = new Runnable() {
//            @Override
//            public void run() {
//                for (int i = 1; i <= 100; i++) {
//                    System.out.println(Thread.currentThread().getName() + " "  +  i);
//                }
//            }
//        };

        Runnable myTask = () -> {
            for (int i = 1; i <= 100; i++) {
                System.out.println(Thread.currentThread().getName() + " "  +  i);
            }
        };

        for (int i = 0; i < 4; i++) {
            new Thread(myTask).start();
        }

        System.out.println("main over");
    }

}

从匿名类到 Lambda 的转换举例2 :

public class LamdbaDemo4 {

    public static void show(A a) {
        a.f1();
    }

    public static void main(String[] args) {
//        A a = new A() {
//            @Override
//            public void f1() {
//                System.out.println("a f1");
//            }
//
//            @Override
//            public void f2() {
//                System.out.println("a f2");
//            }
//
//        };
//        show(a);

        //如果2个抽象方法不能使用lambda表达式
        show(() -> {
            System.out.println("a lambda f1");
        });

    }

    @FunctionalInterface
    interface A {
        void f1();
    }

    interface B {
        void f2();
    }

}

2.2 语法

Lambda 表达式: 在Java 8 语言中引入的一种新的语法元素和操作符。这个操作符为 “->” , 该操作符被称为 Lambda

操作符或箭头操作符。它将 Lambda 分为两个部分:

  • 匿名内部类实现的接口一定是函数接口(只有一个抽象方法的接口)
  • 左侧: 指定了 Lambda 表达式需要的参数列表
  • 右侧: 指定了 Lambda 体, 是抽象方法的实现逻辑,也即Lambda 表达式要执行的功能

2.3 类型推断

Lambda 表达式中的参数类型都是由编译器推断得出的。 Lambda表达式中无需指定类型,程序依然可以编译,这是因为 javac 根据程序的上下文,在后台推断出了参数的类型。 Lambda 表达式的类型依赖于上下文环境,是由编译器推断出来的。这就是所谓的“类型推断” 。

在这里插入图片描述
一个参数:

/**
 * 一个参数的语法
 */
public class LamdbaDemo5 {

    public static void show(B b) {
        b.f1("hello lambda 表达式");
    }

    /**
     * 匿名内部类
     */
    public void test1() {
        //匿名内部类
        B b = new B() {
            @Override
            public void f1(String s) {
                System.out.println(s);
            }
        };
        show(b);
    }

    /**
     * lambda表达式
     */
    @Test
    public void test2() {
        //匿名内部类
//        B b = (String str) -> {
//            System.out.println(str);
//        };
//        show(b);

        show((String str) -> {
            System.out.println(str);
        });
    }

    /**
     * lambda表达式左边参数列表,可以根据上下文判断参数类型
     */
    @Test
    public void test3() {
        show((str) -> {
            str += " hello abc";
            System.out.println(str);
        });
    }

    /**
     * 只有一个参数
     */
    @Test
    public void test4() {
        show(str -> {
            str += " hello abc";
            System.out.println(str);
        });
    }

    @FunctionalInterface
    interface B {
        void f1(String s);
    }


}

两个参数:

/**
 * 多个参数的语法
 */
public class LamdbaDemo6 {

    public static void show(C c) {
        c.f1(10, 20);
    }

    /**
     * 打印两个数的大的值
     */
    @Test
    public void test1() {
        C c = new C() {
            @Override
            public void f1(int x, int y) {
                System.out.println(x > y ? x : y);
            }
        };
        show(c);
    }

    @Test
    public void test2() {
        show((x, y) -> {
//            System.out.println(x > y ? x :y);
            System.out.println(x + y);
        });
    }


    @FunctionalInterface
    interface C {
        void f1(int x, int y);
    }

    @Test
    public void test3() {
        List list = new ArrayList();

        list.add("555");
        list.add("zzz");
        list.add("xxx");
        list.add("yyy");
        list.add("mmm");
        list.add("nnn");
        list.add("aaa");
        list.add("aaa");
        list.add("111");
        list.add("111");
        list.add("222");
        list.add("333");
        list.add("444");

        Comparator com = new Comparator() {
            @Override
            public int compare(Object o1, Object o2) {
                String s1 = (String) o1;
                String s2 = (String) o2;
                return -s1.compareTo(s2);
            }

        };
        Collections.sort(list, com); //定制排序

        System.out.println(list);
    }


    @Test
    public void test4() {
        List list = new ArrayList();

        list.add("555");
        list.add("zzz");
        list.add("xxx");
        list.add("yyy");
        list.add("mmm");
        list.add("nnn");
        list.add("aaa");
        list.add("aaa");
        list.add("111");
        list.add("111");
        list.add("222");
        list.add("333");
        list.add("444");

//        Comparator com = new Comparator() {
//            @Override
//            public int compare(Object o1, Object o2) {
//                String s1 = (String) o1;
//                String s2 = (String) o2;
//                return -s1.compareTo(s2);
//            }
//
//        };

        //定制排序器
        Comparator<String> com = (s1, s2) -> {
            return -s1.compareTo(s2);
        };
        Collections.sort(list, com); //定制排序

        System.out.println(list);
    }



}

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值