更新时间:2022-12-06 11:09:42 来源:极悦 浏览1024次
在这篇文章中,我们将讨论双冒号运算符(::)在Java 8和场景的操作员可以使用。
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);
我们使用:运营商作为λ速记调用一个特定的方法——的名字。最后,结果当然是更可读语法。
非常简单地说,当我们使用一个方法参考——目标参考前放置分隔符::方法的名称后提供。
例如:
Computer::getAge;
我们正在寻找一个方法参考方法getAge计算机类中定义。
我们可以操作的函数:
Function<Computer, Integer> getAge = Computer::getAge;
Integer computerAge = getAge.apply(c1);
请注意,我们引用函数,然后将它应用到合适的参数。
我们可以好好利用这个运营商相当一段场景。
(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超类。
(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教程,里面还有更丰富的知识等着大家去学习,希望对大家能够有所帮助。
0基础 0学费 15天面授
Java就业班有基础 直达就业
业余时间 高薪转行
Java在职加薪班工作1~3年,加薪神器
工作3~5年,晋升架构
提交申请后,顾问老师会电话与您沟通安排学习