说我有这个班级
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?但是,如果我正在审查的项目没有,它只是继续前进?
谢谢!
答案 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()