Java 带有 instanceof 和 class cast 方法引用的流
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);
而不是 for-each-add,您可以使用 Collectors.toSet()
:
收集流项目
Set<Text> childrenToRemove = group.getChildren()
// ...
.collect(Collectors.toSet());
如果需要保持children的顺序,请使用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));
我可以使用方法引用转换以下代码吗?
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);
而不是 for-each-add,您可以使用 Collectors.toSet()
:
Set<Text> childrenToRemove = group.getChildren()
// ...
.collect(Collectors.toSet());
如果需要保持children的顺序,请使用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));