我在Java 8中搜索方法detect
。我以前在Smalltalk中使用它,但Java似乎没有它。 Smalltalk的detect
方法根据表达式的结果查找第一个元素。例如:
Listnumbers.detect[number->number>4]
如果存在大于4的元素,则返回该元素。
答案 0 :(得分:9)
在java 8中,您可以使用流API:
Collection<T> collection = ... //
Optional<T> optionalFirst = collection.stream()
.filter(e -> /* some predicate */)
.findFirst();
如果它存在,那将在集合中找到满足谓词的第一个元素。
答案 1 :(得分:2)
或者没有溪流你可以做
for(T t: collection)
if(t.test()) {
// do something with t
break;
}
答案 2 :(得分:1)
如果你使用受Smalltalk启发的Eclipse Collections,你会发现可以与Java 8 lambdas一起使用的方法detect:
和detect:ifNone:
。
例如:
MutableList<Integer> numbers = Lists.mutable.with(1, 2, 3, 4, 5);
Integer result = numbers.detect(each -> each > 4);
Assert.assertEquals(Integer.valueOf(5), result);
在this article on InfoQ中有更多使用detect
,select
,reject
,collect
与Eclipse集合(以前称为GS集合)和Java 8的示例。 Eclipse Collections 7.x也可以用于仍在Java 5 - 7上运行的应用程序。
注意:我是Eclipse Collections的提交者。