JDK8 新特性(六)

81 阅读2分钟

本文已参与「新人创作礼」活动,一起开启掘金创作之路。

方法引用和构造器引用

概述

  • Lambda 表达式是用来简化函数式接口的变量或形参赋值的语法,而方法引用和构造器引用是为了简化 Lambda 表达式的。
  • 当 Lambda 表达式满足如下的一些特殊情况,还可以再简化:
  • ① Lambda 体只有一条语句,并且是通过调用一个对象(或类)的方法来完成的。
  • 例如:System.out 对象,调用 println() 方法来完成 Lambda 体。Math 类,调用 random() 静态方法来完成 Lambda 体。
  • ② Lambda 表达式的形参正好是给该方法的实参。
  • 例如:t -> System.out.println(t)()->Math.random()

方法引用

  • 语法:
    • 实例对象名::实例方法
    • 类名::静态方法
    • 类名::实例方法
  • 说明:
  • :: 是方法引用操作符。
  • Lambda 表达式的形参列表全部在 Lambda 体中使用了,要么作为调用方法的对象,要么作为调用方法的实参。
  • 在整个 Lambda 中没有额外的数据。

示例1:

package com.github.demo13;

import java.util.Arrays;
import java.util.List;

public class Test {
    public static void main(String[] args) {
        List<Integer> map = Arrays.asList(1, 2, 3, 4, 5);
        map.forEach(System.out::println);
    }
}

示例2:

package com.github.demo14;

import java.util.Arrays;

public class Test {
    public static void main(String[] args) {
        String[] arr = {"hello", "world", "java", "c"};
        Arrays.sort(arr, String::compareToIgnoreCase);
        Arrays.asList(arr).forEach(System.out::println);
    }
}

示例3:

package com.github.demo15;

import java.util.stream.Stream;

public class Test {
    public static void main(String[] args) {
        Stream.generate(Math::random).limit(10).forEach(System.out::println);
    }
}

构造器引用

  • 语法:
    • 类名::new
    • 数组类型::new
    • 说明:
  • 当 Lambda 表达式是为了创建一个对象,并且满足 Lambda 表达式形参,正好是创建给这个对象的构造器的实参列表。
  • 当 Lambda 表达式是为了创建一个数组对象,并且满足 Lambda 表达式形参,正好是创建这个数组对象的长度 示例1:
package com.github.demo16;

import java.util.stream.Stream;

public class Test {
    public static void main(String[] args) {
        Stream<Integer> stream = Stream.of(1, 2, 3);
        Stream<int[]> stream1 = stream.map((i) -> new int[i]);
        // Lambda表达式
        stream1.forEach((i) -> System.out.println(i.length));

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

        Stream<Integer> stream11 = Stream.of(1, 2, 3);
        Stream<int[]> stream2 = stream11.map(int[]::new);
        // 构造引用
        stream2.forEach((i) -> System.out.println(i.length));
    }
}

示例2:

package com.github.demo17;

import java.math.BigDecimal;
import java.util.stream.Stream;

public class Test {
    public static void main(String[] args) {
        Stream<String> stream = Stream.of("1", "2", "3");
        Stream<BigDecimal> stream1 = stream.map(s -> new BigDecimal(s));
        stream1.forEach(System.out::println);
        System.out.println("---------------");
        Stream<String> stream11 = Stream.of("1", "2", "3");
        Stream<BigDecimal> stream2 = stream11.map(BigDecimal::new);
        stream2.forEach(System.out::println);
    }
}