专注Java教育14年 全国咨询/投诉热线:444-1124-454
赢咖4LOGO图
始于2009,口口相传的Java黄埔军校
首页 学习攻略 Java学习 Java8中的双冒号运算符

Java8中的双冒号运算符

更新时间:2022-12-06 11:09:42 来源:赢咖4 浏览806次

1. 概述

在这篇文章中,我们将讨论双冒号运算符(::)在Java 8和场景的操作员可以使用。

2. 从λ双冒号运算符

Lambdas表达式,我们看到,代码可以变得非常简洁。

例如,要创建一个比较器,以下语法就足够了:

Comparator c = (Computer c1, Computer c2) -> c1.getAge().compareTo(c2.getAge());

然后,类型推断:

Comparator c = (c1, c2) -> c1.getAge().compareTo(c2.getAge());

但我们能让上面的代码更加富有表现力和可读吗?让我们看一看:

Comparator c = Comparator.comparing(Computer::getAge);

我们使用:运营商作为λ速记调用一个特定的方法——的名字。最后,结果当然是更可读语法。

3.它是如何工作的呢?

非常简单地说,当我们使用一个方法参考——目标参考前放置分隔符::方法的名称后提供。

例如:

Computer::getAge;

我们正在寻找一个方法参考方法getAge计算机类中定义。

我们可以操作的函数:

Function<Computer, Integer> getAge = Computer::getAge;
Integer computerAge = getAge.apply(c1);

请注意,我们引用函数,然后将它应用到合适的参数。

4. 方法引用

我们可以好好利用这个运营商相当一段场景。

(1)静态方法

首先,我们将使用一个静态的实用方法:

List inventory = Arrays.asList(
  new Computer( 2015, "white", 35), new Computer(2009, "black", 65));
inventory.forEach(ComputerUtils::repair);

(2)现有对象的一个实例方法

接下来,让我们看一看一个有趣的场景——现有对象实例的引用一个方法。

Computer c1 = new Computer(2015, "white");
Computer c2 = new Computer(2009, "black");
Computer c3 = new Computer(2014, "black");
Arrays.asList(c1, c2, c3).forEach(System.out::print);

(3)一个实例方法的任意一个特定类型的对象

Computer c1 = new Computer(2015, "white", 100);
Computer c2 = new MacbookPro(2009, "black", 100);
List inventory = Arrays.asList(c1, c2);
inventory.forEach(Computer::turnOnPc);

如你所见,我们引用turnOnPc方法而不是一个具体的实例,但是在类型本身。

在4号线实例方法turnOnPc将呼吁每个对象的库存。

这自然意味着c1 - turnOnPc方法将被称为计算机实例和c2 MacbookPro实例上。

(4)一个超级某个特定对象的方法

假设你有以下方法在计算机超类:

public Double calculateValue(Double initialValue) {
    return initialValue/1.50;
}

这一个在MacbookPro子类:

@Override
public Double calculateValue(Double initialValue){
    Function<Double, Double> function = super::calculateValue;
    Double pcValue = function.apply(initialValue);
    return pcValue + (initialValue/10) ;
}

调用calculateValue方法MacbookPro实例:

macbookPro.calculateValue(999.99);

也会产生也在电脑上调用calculateValue超类。

5. 构造函数引用

(1)创建一个新的实例

引用一个构造函数实例化一个对象可以很简单:

@FunctionalInterface
public interface InterfaceComputer {
    Computer create();
}
InterfaceComputer c = Computer::new;
Computer computer = c.create();

如果你在一个构造函数有两个参数吗?

BiFunction<Integer, String, Computer> c4Function = Computer::new; 
Computer c4 = c4Function.apply(2013, "white");

如果参数是三个或更多,你必须定义一个新功能界面:

@FunctionalInterface 
interface TriFunction<A, B, C, R> { 
    R apply(A a, B b, C c); 
    default <V> TriFunction<A, B, C, V> andThen( Function<? super R, ? extends V> after) { 
        Objects.requireNonNull(after); 
        return (A a, B b, C c) -> after.apply(apply(a, b, c)); 
    } 
}

然后,初始化您的对象:

TriFunction <Integer, String, Integer, Computer> c6Function = Computer::new;
Computer c3 = c6Function.apply(2008, "black", 90);

(2)创建一个数组

最后,让我们看看如何创建计算机对象数组和五个要素:

Function <Integer, Computer[]> computerCreator = Computer[]::new;
Computer[] computerArray = computerCreator.apply(5);

以上就是关于“Java8中的双冒号运算符”的介绍,大家如果想了解更多相关知识,可以关注一下本站的Java教程,里面还有更丰富的知识等着大家去学习,希望对大家能够有所帮助。

提交申请后,顾问老师会电话与您沟通安排学习

免费课程推荐 >>
技术文档推荐 >>