gpt4 book ai didi

Java 8 可选,多过滤器和多映射

转载 作者:行者123 更新时间:2023-11-30 06:55:40 26 4
gpt4 key购买 nike

我想使用 Java 8,如何在 Java 8 中将命令式风格转换为函数式风格 Optional

例如,假设 exchange.getIn().getBody() 可能为 null 或不是。

String color = null;
if(exchange.getIn().getBody() instanceof Foo) {
color = "toFoo";
} else if(exchange.getIn().getBody() instanceof Bar){
color = "toBar";
}

也许是这样的东西,但我需要它在一个衬里。

 Optional.ofNullable(exchange.getIn().getBody())
.filter(body -> body instanceof Foo)
.map(body -> "toFoo");

我的问题是 map 已经是一个字符串,所以我无法将它变成一个衬里:

 Optional.ofNullable(exchange.getIn().getBody())
.filter(body -> body instanceof Foo)
.map(body -> "toFoo")
.orElse(exchange.getIn().getBody()) //this part is problem, already String
.filter(body -> body instanceof Bar)
.map(body -> "toBar");

最佳答案

你要做的是模式匹配,这不是Optional的目的。您可以滥用 Optional 来获得产生所需结果的东西,例如

Object o=exchange.getIn().getBody();
String color=Optional.ofNullable(o).filter(Foo.class::isInstance).map(x->"toFoo")
.orElseGet(()->Optional.ofNullable(o).filter(Bar.class::isInstance).map(x->"toBar")
.orElse("fallback"));

但这显然不是真正的胜利,尤其是当您考虑添加更多案例时会发生什么。

实现目标的一种方法是通过 Map 关联谓词和结果:

Map<Predicate<Object>,String> alternatives=new HashMap<>();
alternatives.put(Bar.class::isInstance, "toBar");
alternatives.put(Foo.class::isInstance, "toFoo");

Object o=exchange.getIn().getBody();
String color=alternatives.entrySet().stream()
.filter(e->e.getKey().test(o))
.findAny().map(Map.Entry::getValue).orElse("fallback");

这执行线性搜索(没有特定顺序,因此谓词必须是分离的),这适用于少数情况,您可以添加另一个简单的情况

alternatives.put(Baz.class::isInstance, "toBaz");

但对于更多情况,以允许高效查找的方式对谓词进行编码(例如,使用类作为映射键并动态添加遇到的子类)是更可取的。

请注意,上面的两个示例使用 "fallback" 作为没有满足谓词的情况的值。您可以简单地将其替换为 null 以获得与问题代码中相同的回退结果。

关于Java 8 可选,多过滤器和多映射,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/35065303/

26 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com