使用Lambda和forEach在Set中查找Object并触发布尔值

时间:2016-12-30 21:34:05

标签: java foreach lambda java-8

说我有这个班级

    public class MovieCharacter {

    private String name;

    public String getName() { return name ; }
    public String setName(String name) { this.name = name; }
    }

我正在运行测试并拥有一个Set,我想使用Lambda梳理每个对象以查看它是否包含Name所需的String。如果找到名称,则布尔值跳转到" true"。找到之后,我不想再次更改布尔值。

Set<MovieCharacter> mySet // assume this Set has previously been created and 
                     // contains 1,000's of MovieCharacter

boolean hasName = false;
mySet.forEach( i -> i.getName().equals("Darth Vader")) // add here?
assertTrue(hasName);

我知道我已经关闭了,但是如何完成lambda线,如果该组包含一个MovieCharacter,其中.getName()返回&#34; Darth Vader&#34;布尔值然后会被设置为true?但是,如果我正在审查的项目没有,它只是继续前进?

谢谢!

2 个答案:

答案 0 :(得分:5)

您正在描述的行为正是anyMatch方法的设计目标:

boolean hasName = mySet.stream().anyMatch(c -> c.getName().equals("Darth Vader"));

答案 1 :(得分:1)

这里需要的是结合findFirst()的过滤操作,返回Optional

如果您确定自己的设置中有这样的项目,那么您可以在get()之后安全地拨打findFirst(),但一般情况下我建议您使用orElse提供默认值或使用orElseThrow上的Optional抛出异常或使用其他有用的方法之一。明智地选择适合您的情况:)

set.stream()
   .filter(character -> character.getName().equals("Darth Veider"))
   .findFirst()