JDK8新特性 -- Lambda表达式

JDk8新特性 -- Lambda

  • JDK8新特性
  • Lambda表达式
    • 以下是lambda表达式的重要特征:
      • 例子一:
      • 例子二:
    • 内置四大核心函数式接口
      • 1.消费型
      • 2.供给型
      • 3.函数型
      • 4.断定型
  • 总结

JDK8新特性

  • Lambda 表达式 − Lambda允许把函数作为一个方法的参数(函数作为参数传递进方法中。
  • 方法引用 − 方法引用提供了非常有用的语法,可以直接引用已有Java类或对象(实例)的方法或构造器。与lambda联合使用,方法引用可以使语言的构造更紧凑简洁,减少冗余代码。
  • 默认方法 − 默认方法就是一个在接口里面有了一个实现的方法。
  • 新工具 − 新的编译工具,如:Nashorn引擎 jjs、 类依赖分析器jdeps。
  • Stream API −新添加的Stream API(java.util.stream) 把真正的函数式编程风格引入到Java中。
  • Date Time API − 加强对日期与时间的处理。
  • Optional 类 − Optional 类已经成为 Java 8 类库的一部分,用来解决空指针异常。
  • Nashorn, JavaScript 引擎 − Java 8提供了一个新的Nashorn
    javascript引擎,它允许我们在JVM上运行特定的javascript应用。

更多的新特性可以参阅官网:What’s New in JDK 8

Lambda表达式

Lambda 表达式,也可称为闭包,它是推动 Java 8 发布的最重要新特性。

Lambda 允许把函数作为一个方法的参数(函数作为参数传递进方法中)。

使用 Lambda 表达式可以使代码变的更加简洁紧凑。

以下是lambda表达式的重要特征:

  • 可选类型声明:不需要声明参数类型,编译器可以统一识别参数值。
  • 可选的参数圆括号:一个参数无需定义圆括号,但多个参数需要定义圆括号。
  • 可选的大括号:如果主体包含了一个语句,就不需要使用大括号。
  • 可选的返回关键字:如果主体只有一个表达式返回值则编译器会自动返回值,大括号需要指定明表达式返回了一个数值。

例子一:

@Test
    public void test1() {

        //普通方式
        Runnable r = new Runnable() {

            @Override
            public void run() {
                System.out.println("执行方法");
            }
        };
        r.run();

        System.out.println("*******************************************");

        //lambda表达式方式

        Runnable r2 = () -> System.out.println("执行了方法");

        r2.run();

    }

@FunctionalInterface
public interface Runnable {
    /**
     * When an object implementing interface Runnable is used
     * to create a thread, starting the thread causes the object's
     * run method to be called in that separately executing
     * thread.
     * 

* The general contract of the method run is that it may * take any action whatsoever. * * @see java.lang.Thread#run() */ public abstract void run(); }

像这种函数式接口(@FunctionalInterface),用lambda表达式写是最方便的,不需要再写匿名内部类,书写方便,可读性也可以。

例子二:

例子一中,是没有形参的,就可以直接用()。如果有参数,就在()中加参数,参数可以写类型,也可以不写(会根据类型推断)

@Test
    public void test2() {
        Comparator<Integer> c = new Comparator<Integer>() {
            @Override
            public int compare(Integer o1, Integer o2) {
                return o1.compareTo(02);
            }
        };

        System.out.println(c.compare(1, 10));

        System.out.println("**************************");

        Comparator<Integer> comparator = (o1, o2) -> o1.compareTo(o2);
        Comparator<Integer> comparator2 = (o1, o2) -> Integer.compare(o1, o2);

        System.out.println(comparator.compare(10, 1));
        System.out.println(comparator2.compare(10, 100));

    }

内置四大核心函数式接口

1.消费型 Consumer void accept(T t)
2.供给型 Supplier T get()
3.函数型 Function R apply(T t)
4.断定型 Predicate boolean test(T t)

1.消费型

 @Test
    public void test3() {
        //1.消费型  Consumer  void accept(T t)
        Consumer<String> c = s -> System.out.println(s);
        c.accept("hello world");

    }

//输出结果 hello world

有输入,返回值为void

2.供给型

@Test
    public void test4() {
        //2.供给型  Supplier  T get()
        Supplier<String> supplier = () -> "nihao ";

        System.out.println(supplier.get());
    }
//输出   nihao

没有输入,有返回值

3.函数型

@Test
    public void test5() {
        //3.函数型  Function R apply(T t)
        Function<String, Integer> function = s -> s.length();

        System.out.println(function.apply("hello world"));
    }

// 11

T为形参类型,R为返回值类型

4.断定型

@Test
    public void test6() {
        //4.断定型  Predicate  boolean test(T t)
        Predicate<Integer> predicate = integer -> integer >= 100;

        System.out.println(predicate.test(99));
//false
    }

T为形参类型, 返回值为boolean型

总结

Lambda给java注入的新鲜血液,可以有效的提高开发,减少代码量,试代码看着整洁很值得学习

你可能感兴趣的:(Java学习)