Java 8 教程(LTS)

一些关于 Java 8 的使用实例和技巧,希望你能喜欢这个系列教程。(无链接的更新中)

扩展阅读:Java 各版本(8-16)新功能介绍

常见搜索

在 Java 8 中,引入了 @FunctionalInterface 注解,被此注解描述的接口为函数式接口,函数式接口中有且只有一个抽象方法。函数式接口可以用于 Lambda 表达式。

在 Java 8 包 java.util.function 中,有多种函数接口,下面是几种最基本的函数接口。

函数接口 方法 描述
Function<T,R> R apply(T t) 接受一个类型 T 参数,返回值类型为 R。如:Arrays::asList
Predicate<T, U> boolean test(T t) 接受一个类型 T 参数,返回值类型为布尔。如:String::isEmpty
Supplier<T> T get() 无参数,返回值类型为泛型 T。如:LocalDate::now
Consumer<T> void accept(T t) 接受一个类型 T 参数,无返回值。如:System.out::println
BinaryOperator<T> T apply(T t1, T t2) 接受两个 T 类型参数,返回值类型为 T。如:Math::pow
UnaryOperator<T> T apply(T t) 接受一个类型 T 参数,返回值类型为 T。如:String::toUpperCase

Java 8 函数式接口介绍。

2. Lambda 表达式 和 方法引用

在 Java 8 中,不仅引入了函数式接口,还引入了 Lambda 表达式,使用 Lambda 表达式可以实现函数式接口中的操作。

扩展阅读Java 8 Lambda 表达式介绍

示例:使用 forEach 遍历集合元素, 在 Java 8 中,forEach 接受一个 Consumer 函数式接口。

package com.wdbyte;

import java.util.Arrays;
import java.util.List;
import java.util.function.Consumer;

public class Java8ForEachDiy {

    public static void main(String[] args) {
        List<String> list = Arrays.asList("java", "nodejs", "c++", "wdbyte.com");
        list.forEach(new Consumer<String>() {
            @Override
            public void accept(String s) {
                System.out.println(s);
            }
        });
    }
}

输出结果:

java
nodejs
c++
wdbyte.com

上面的例子看起来比较繁琐,可以使用 Lambda 表达式改进。

public static void main(String[] args) {
    List<String> list = Arrays.asList("java", "nodejs", "c++", "wdbyte.com");
    list.forEach(s -> System.out.println(s));
}

Lambda 表达式还支持方法引用的方式,通过双冒号使用方法引用,方法引用只是函数调用的一种方式,可以让代码更加简洁。

public static void main(String[] args) {
    List<String> list = Arrays.asList("java", "nodejs", "c++", "wdbyte.com");
    list.forEach(System.out::println);
}

评论
ValineDisqus