我已经检查了以下代码片段:
public static <T> Predicate<T> distinctByKey(Function<? super T, ?> keyExtractor) {
Map<Object, Boolean> computed = new ConcurrentHashMap<>();/*IS THIS LINE CALLED ONCE ON STREAM->FILTER NOT MATTER HOW LONG THE STREAM IS*/
return t -> {return computed.putIfAbsent(keyExtractor.apply(t), Boolean.TRUE) == null;};
}
private void test(){
final long d = Stream.of("JOHN","STEPHEN","ORTIZ","RONDON")
.filter(distinctByKey(Function.identity()))
.count();
System.out.println("d = " + d);
}
这个代码不是我的。我知道在本例中使用concurrentmap
不是正确的选择,在本例中我应该使用concurrentmap
而不是map
,但这不是我现在关心的问题。
我认为DistinctByKey
方法将在流的每次迭代中调用或解释
。我指的是每个回合都实例化的
映射
,但事实并非如此!
谓词
方法的主体只调用一次吗?
在
流
迭代中,这是断言吗?
因为当我尝试以下代码时:
final Function<String,Integer>a = (name)->name.length();
System.out.println(distinctByKey(a).test("JOHN"));
System.out.println(distinctByKey(a).test("STEPHEN"));
System.out.println(distinctByKey(a).test("ORTIZ"));
System.out.println(distinctByKey(a).test("RONDON"));
我可以看到方法的主体确实在每一行中被调用。是什么使过滤器的主体只能被调用一次?
DistinctByKey
返回谓词
的单个实例,该实例缓存ConcurrentHashMap
。例如,如果将通过lambda创建的谓词
替换为匿名内部类,则可以实现几乎相同的效果。
我试图创建一个从最终用户抽象谓词使用的类。 我的应用程序使用了番石榴重试扩展,效果很好。 我可以很容易地用谓词调用它,它会轮询,直到谓词返回false。 现在,也许我误解了谓词,但我正在尝试创建一个类来抽象它们。 我想这样称呼它 所以我写了如下PollCondition类。 但是MyPoller。poll()调用无法编译-未声明结果。 知道吗?
这是我的家长课 然后我创建了一个列表 然后我向objList添加了许多父对象。 现在我想根据类中字段的值过滤这些对象。但是我只会动态地得到字段名。我想为此使用流。 这里getAttrib2()有所不同。它可以是getAttrib1()或getAttrib3()。 所以我需要动态函数调用。我们能用谓词实现它吗。不幸的是,我对谓词对象一无所知。请详细解释你的答案,里面有所有的概念。
有两个具有相同结构的地图,即map1和map2,其结构为
下面的lexer语法片段应该根据类中定义的谓词来标记“自定义名称”: CUSTOM_NAME的正确匹配总是尽可能长的匹配。现在,如果lexer遇到一个自定义名称,比如,那么我希望它对整个字符串,然后用'some:cname'作为参数调用一次谓词。 编辑:这种行为的有趣之处在于,只要将部分匹配传递给谓词,谓词的结果似乎完全被lexer忽略了。这似乎效率很低。
在Java 8中,您可以使用方法引用来过滤流,例如: 有没有一种方法可以创建一个方法引用,它是现有方法引用的否定,例如: 我可以像下面这样创建方法,但我想知道JDK是否提供了类似的东西。
问题内容: 我正在为我的第一个应用程序浏览本教程(学习Swift):http : //www.appcoda.com/search-bar-tutorial- ios7/ 我被困在这部分(Objective-C代码): 谁能建议如何在Swift中为NSPredicate创建等效项? 问题答案: 这实际上只是语法切换。好,所以我们有这个方法调用: 在Swift中,构造函数跳过“ blahWith…”