Last Updated:

Java 8 教程

银狐
Java 8 徽标

一系列 Java 8 技巧和示例,希望您喜欢。

常见问题

一些常见的问题。

1. 功能接口

Java 8 引入了@FunctionalInterface,一个只有一个抽象方法的接口。编译器会将任何满足函数式接口定义的接口视为函数式接口;这意味着@FunctionalInterface注释是可选的。

让我们看看六个基本功能接口。

界面签名例子
UnaryOperator<T>T apply(T t)String::toLowerCaseMath::tan
BinaryOperator<T>T apply(T t1, T t2)BigInteger::addMath::pow
Function<T, R>R apply(T t)Arrays::asListInteger::toBinaryString
Predicate<T, U>boolean test(T t, U u)String::isEmptyCharacter::isDigit
Supplier<T>T get()LocalDate::nowInstant::now
Consumer<T>void accept(T t)System.out::printlnError::printStackTrace
 

2. Lambda 表达式和方法参考

Java 8 引入了 lambda 表达式来提供函数接口的抽象方法的实现。

进一步阅读 >>> Java 8 Lambda:比较器示例

查看JDKIterable类,它有一个default方法forEach()接受一个功能界面Consumer

Iterable.java

public interface Iterable<T> {

    default void forEach(Consumer<? super T> action) {
        Objects.requireNonNull(action);
        for (T t : this) {
            action.accept(t);
        }
    }

   //...
}

首先,我们可以提供一个匿名类作为forEach实现。


List<String> list = Arrays.asList("node", "java", "python", "ruby");
list.forEach(new Consumer<String>() {       // anonymous class
    @Override
    public void accept(String str) {
        System.out.println(str);
    }
});

或者,我们可以使用 lambda 表达式来缩短代码,如下所示:


List<String> list = Arrays.asList("node", "java", "python", "ruby");
list.forEach(str -> System.out.println(str)); // lambda expressions

为了获得更好的可读性,我们可以用方法引用替换 lambda 表达式。


List<String> list = Arrays.asList("node", "java", "python", "ruby");
list.forEach(System.out::println);           // method references

进一步阅读 >>> Java 8 方法引用,双冒号 (::) 运算符

注意
lambda 表达式或方法引用都只是对现有方法的另一种调用。通过方法引用,它获得了更好的可读性。

3. 流

4. 新的日期时间 API

在过去,我们使用DateCalendarAPI来表达和处理日期。

  • java.util.Date – 日期和时间,使用默认时区打印。
  • java.util.Calendar – 日期和时间,更多操作日期的方法。
  • java.text.SimpleDateFormat – 格式化(日期 -> 文本),解析(文本 -> 日期)日期和日历。

Java 8 在 package.json 中创建了一系列新的日期和时间 API java.time。(JSR310并受 Joda-time 启发)。

  • java.time.LocalDate – 没有时间的日期,没有时区。
  • java.time.LocalTime – 没有日期的时间,没有时区。
  • java.time.LocalDateTime – 日期和时间,无时区。
  • java.time.ZonedDateTime – 日期和时间,带时区。
  • java.time.DateTimeFormatter – 格式化(日期 -> 文本),解析(文本 -> 日期)java.time。
  • java.time.Instant – 机器的日期和时间,自 Unix 纪元时间(UTC 1970 年 1 月 1 日午夜)以来经过的秒数
  • java.time.Duration – 以秒和纳秒为单位测量时间。
  • java.time.Period – 以年、月和日为单位测量时间。
  • java.time.TemporalAdjuster – 调整日期。
  • java.time.OffsetDateTime - {告诉我}

例子…

5. Java 8 技巧

安装

参考