- iOS/Objective-C 元类和类别
- objective-c - -1001 错误,当 NSURLSession 通过 httpproxy 和/etc/hosts
- java - 使用网络类获取 url 地址
- ios - 推送通知中不播放声音
最近我一直在研究 java8 的新特性,以便更好地理解它们。
当尝试使用 Stream.filter
进行一些操作时,我发现了 Predicate.java
的源代码,在其中我发现了以下 isEqual
的实现> 方法:
/**
* Returns a predicate that tests if two arguments are equal according
* to {@link Objects#equals(Object, Object)}.
*
* @param <T> the type of arguments to the predicate
* @param targetRef the object reference with which to compare for equality,
* which may be {@code null}
* @return a predicate that tests if two arguments are equal according
* to {@link Objects#equals(Object, Object)}
*/
static <T> Predicate<T> isEqual(Object targetRef) {
return (null == targetRef)
? Objects::isNull
: object -> targetRef.equals(object);
}
让我好奇的是这一行:: object -> targetRef.equals(object);
。
也许我想太多了,但我忍不住马上想到为什么那行不是 : targetRef::equals;
像这样:
static <T> Predicate<T> isEqual(Object targetRef) {
return (null == targetRef)
? Objects::isNull
: targetRef::equals;
}
在我看来,否则创建 lambda 是不必要的。
除非我遗漏了什么,否则对我来说那些都是一样的。 (它们是一样的吗?)选择当前实现有什么原因吗?或者这只是一件非常小的事情,它只是被忽视了,或者没有人真正关心过。
猜猜这实际上会导致一个额外的问题:使用一种方式比另一种方式有什么好处吗?喜欢某种(可能非常小的)绩效奖金?
最佳答案
Why was it done this way?
纯粹的猜测,但是,也许在编写它时开发人员对 -> 更满意,并且可能::当时甚至都不起作用。这些库是在修复编译器中的错误的同时编写的。
没有办法知道,甚至写它的人可能也不记得了。
无论您使用方法引用还是闭包语法,在大多数情况下都会创建相同数量的对象(如本例所示)
Guess that actually results in a bonus question: Is there any benefit in using one way over the other? Like some kind of (probably very small) performance bonus?
使用方法引用意味着更少的方法调用。这可能会对内联产生间接影响,因为默认情况下级别数限制为 9。例如
import java.util.function.Consumer;
public class Main {
public static void main(String[] args) {
Consumer<String> lambda = s-> printStackTrace(s);
lambda.accept("Defined as a lambda");
Consumer<String> methodRef = Main::printStackTrace;
methodRef.accept("Defined as a method reference");
}
static void printStackTrace(String description) {
new Throwable(description).printStackTrace();
}
}
打印
java.lang.Throwable: Defined as a lambda
at Main.printStackTrace(Main.java:15)
at Main.lambda$main$0(Main.java:6)
at Main.main(Main.java:7)
java.lang.Throwable: Defined as a method reference
at Main.printStackTrace(Main.java:15)
at Main.main(Main.java:10)
在第一种情况下,编译器生成了一个名为 Main.lambda$main$0
的方法,其中包含实际调用 printStackTrace
当您可以使用捕获(保存值)或非捕获 lambda 时,使用其中一个或另一个会产生更大的不同。非捕获 lambda 仅创建一次。
例如
Consumer<String> print1 = System.out::println; // creates an object each time
Consumer<String> print2 = s->System.out.println(s); // creates an object once.
在第一种情况下,如果您调用 System.setOut
,它将忽略此更改,因为它有自己的 PrintStream 副本要写入。
关于java - 为什么 Predicate.isEqual 是这样实现的?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/39957154/
考虑以下代码 OCMockObject *mock = [OCMockObject mockForClass:[NSObject class]]; [[[mock expect] andReturnV
我正在尝试使用 .isEqual 比较两个对象来自 lodash-node 包的方法。即使对象相同,.isEqual返回 false . var _ = require('lodash-node');
LocalDate在 Java 中有两个类似的方法 equals和 isEqual . 它们之间有什么区别?当他们输出不同的结果时? 最佳答案 LocalDate.equals ,像大多数其他人一样
此函数检查两个对象是否具有相同的值: _.isEqual = (a, b) => { const aKeys = Object.getOwnPropertyNames(a) const bKe
const car = new Map([['100','200']]); const bike = new Map([['200','100']]); _.isEqual(car,bike); //
我正在尝试比较两种颜色,但无法得到正确的结果: 这是我的代码: NSLog(@"selfColor = %@",selfColor); NSLog(@"left = %@",left); NSLog(
背景 我有一个由第 3 方库提供的方法,它返回一个 CLBeacons 数组。 - (void)beaconManager:(ESTBeaconManager *)manager didR
Apple 的文档说如果我覆盖 isEqual: 那么我必须覆盖 hash 以确保哈希值对于被认为相等的两个对象应该相同等于: 然后我阅读了关于哈希的文档,下面是其中的一部分: Therefore,
我有一个类叫 Contact; 在Contact中我有(要测试的简单版本,还没有散列) - (BOOL)isEqual:(id)other { if (other == self)
本文整理了Java中java.time.ZonedDateTime.isEqual()方法的一些代码示例,展示了ZonedDateTime.isEqual()的具体用法。这些代码示例主要来源于Gith
我看到 Julia 有 3 种不同的方式 做平等。 == , === , 和 isequal 我应该使用哪个,何时使用? 最佳答案 ===是内在的平等。 在原语上,它是值相等:如果它们具有相同的位级表
在类中定义的方法在其他类中调用时不会被识别为函数。 文件:模型/book.model.ts export class Book { constructor(public title: stri
在类中定义的方法在其他类中调用时不会被识别为函数。 文件:模型/book.model.ts export class Book { constructor(public title: stri
我有一个使用下划线 isEqual 来比较两个 JSON 字符串的问题。目前我在主干中做了一个应用程序,我正在使用 _.isEqual(savedModel.toJSON(),changedModel
我有一个类,我用它来传递带有文本标签的选择器: @interface TableLink : NSObject @property (nonatomic, strong) NSString* name
我有一个烦人的问题,我试图解决它,但它只是没有发生,所以要么我错过了一些愚蠢的东西,要么我做错了。 基本上 id 喜欢检查一个字符串,如果它是 no,则加载空白字符串,如果还有其他内容,则加载真正的字
最近我一直在研究 java8 的新特性,以便更好地理解它们。 当尝试使用 Stream.filter 进行一些操作时,我发现了 Predicate.java 的源代码,在其中我发现了以下 isEqua
我有一个重写 isEqual 方法的人员类: #import "People.h" @implementation People @synthesize name = _name; -(BOOL)is
喜欢 class A :NSObject { let a :Int let b :UIColor } 我不想通过一一比较所有属性来实现 isEqual。如果那样,当我添加另一个属性时,
我有两个自定义 NSManagedObject 类:Notes 和 Tags。 当我覆盖 Tags 类中的 isEqual: 函数时,我收到如下错误消息: 'Class 'Tags' for enti
我是一名优秀的程序员,十分优秀!