如何解决如何从JAVA 11中的stream filter获取第一个匹配元素?
如何从JAVA 11中的流filter()获取第一个匹配元素?
List<Address> addresses = List.of(
new Address(1,"Office","AAAAA"),new Address(2,"Correspondence","BBBBB"),new Address(3,"Residence","CCCC"),new Address(4,"Next Door","DDDD"));
如何根据优先级检索第一个匹配的地址?
addresses.stream().filter(a->a.getType().equals("Residence")).findAny()
.orElseGet(() -> addresses.stream().filter(a->a.getType()
.equals("Correspondence")).findAny()
.orElseGet(()->addresses.stream().filter(a->a.getType()
.equals("Correspondence")).findAny().orElseGet(null)));
如何简化上面的代码以基于Address
获得Type
?
如果列表中有Residence
类型,则return Address
可用,否则紧随其后的是Correspondence
,Office
和Next Door
。 >
在STREAM
中做这件事的最好方法是什么?
解决方法
使用类型列表,按所需的优先顺序对流进行过滤,并作为与min()
一起在流上使用的比较器的基础:
List<String> types = List.of("Residence","Correspondance","Office","Next Door");
addresses.stream()
.filter(a -> types.contains(a.getType()))
.min(comparingInt(a -> types.indexOf(a.getType())));
-
您通常会在列表中使用常量,因此不必每次都创建它。
private static final List<String> ADDRESS_TYPES = List.of("Residence","Next Door");
——-
p.s的“对应”是拼写为... ence,不是... ance
,private int priority(Address addr) {
switch (addr.getType())
case "Residence":
return 1;
case "Correspondance":
return 2;
case "Office":
return 3;
case "Next Door":
return 4;
default:
return 5;
}
}
private Optional<Address> bestAddress(List<Address> addresses) {
return
addresses.stream().min(Comparator.comparingInt(this::priority));
}
根据评论进行编辑。谢谢。
版权声明:本文内容由互联网用户自发贡献,该文观点与技术仅代表作者本人。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如发现本站有涉嫌侵权/违法违规的内容, 请发送邮件至 dio@foxmail.com 举报,一经查实,本站将立刻删除。