use*_*611 16 java java-8 java-stream
我的目标是过滤最佳匹配.在我的例子中,我有一个人员列表,我想按姓氏和名字过滤.
匹配的优势将是:
我的代码到目前为止:
final List<Person> persons = Arrays.asList(
new Person("Doe", "John"),
new Person("Doe", "Jane"),
new Person("Munster", "Herman");
Person person = persons.stream().filter(p -> p.getSurname().equals("Doe")).???
Run Code Online (Sandbox Code Playgroud)
Cyr*_*ril 16
假设Person实现了equals和hashCode:
Person personToFind = new Person("Doe", "Jane");
Person person = persons.stream()
.filter(p -> p.equals(personToFind))
.findFirst()
.orElseGet(() ->
persons.stream()
.filter(p -> p.getSurname().equals(personToFind.getSurname()))
.findFirst()
.orElseThrow(() -> new RuntimeException("Could not find person ..."))
);
Run Code Online (Sandbox Code Playgroud)
您可以使用
Person person = persons.stream()
.filter(p -> p.getSurName().equals("Doe"))
.max(Comparator.comparing(p -> p.getFirstName().equals("Jane")))
.orElse(null);
Run Code Online (Sandbox Code Playgroud)
它只会考虑具有正确姓氏的元素并返回它们的最佳元素,即具有匹配名字的元素.否则,返回第一个匹配元素.
正如评论中已经提到的,for如果存在最佳元素,则循环可以更有效,因为它可以短路.如果没有匹配姓氏和名字的最佳元素,则必须在所有实现中检查所有元素.
| 归档时间: |
|
| 查看次数: |
994 次 |
| 最近记录: |