繁体   English   中英

带有instanceof和类cast的方法引用的Java流

[英]Java stream with method references for instanceof and class cast

我可以使用方法参考转换以下代码吗?

List<Text> childrenToRemove = new ArrayList<>();

group.getChildren().stream()
    .filter(c -> c instanceof Text)
    .forEach(c -> childrenToRemove.add((Text)c));

让我举一个例子来说明我的意思,假设我们有

myList
    .stream()
    .filter(s -> s.startsWith("c"))
    .map(String::toUpperCase)
    .sorted()
    .forEach(elem -> System.out.println(elem));

使用方法参考它可以写成(最后一行)

myList
    .stream()
    .filter(s -> s.startsWith("c"))
    .map(String::toUpperCase)
    .sorted()
    .forEach(System.out::println);

将表达式转换为方法引用的规则是什么?

是的,您可以使用以下方法参考:

.filter(Text.class::isInstance)
.map(Text.class::cast)
.forEach(childrenToRemove::add);

您可以使用Collectors.toSet()收集流项目,而不是for-each-add:

Set<Text> childrenToRemove = group.getChildren()
    // ...
    .collect(Collectors.toSet());

如果需要维护子项的顺序,请使用toList()

如果签名匹配,则可以使用方法引用替换lambda表达式:

ContainingClass::staticMethodName // method reference to a static method
containingObject::instanceMethodName // method reference to an instance method
ContainingType::methodName // method reference to an instance method
ClassName::new // method reference to a constructor

我想是的,这是可能的,就像这样

group.getChildren()
    .filter(Text.class::isInstance)
    .map(Text.class::cast)
    .collect(Collectors.toCollection(() -> childrenToRemove));

很抱歉恢复此主题,但最后一个答案不符合预期的行为。 通过阅读java文档,供应商将返回一个空集合。 这很重要,因为在收集过程中可以多次调用供应商。 例如:

...collect(Collectors.toCollection(ArrayList::new));

参考java doc: JavaDoc

暂无
暂无

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM