Java中存在来自Smalltalk的Detect方法吗?

时间:2014-04-29 13:56:05

标签: java smalltalk java-8

我在Java 8中搜索方法detect。我以前在Smalltalk中使用它,但Java似乎没有它。 Smalltalk的detect方法根据表达式的结果查找第一个元素。例如:

Listnumbers.detect[number->number>4]

如果存在大于4的元素,则返回该元素。

3 个答案:

答案 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中有更多使用detectselectrejectcollect与Eclipse集合(以前称为GS集合)和Java 8的示例。 Eclipse Collections 7.x也可以用于仍在Java 5 - 7上运行的应用程序。

注意:我是Eclipse Collections的提交者。