如何在Java Stream中应用instanceof模式匹配?
在Stream中应用Java 14的instanceof模式匹配?
假设我们拥有一个Animal类型的Stream,Animal存在多个子类。我们希望对该Stream进行过滤,仅保留其中的Zebra实例,同时得到Zebra类型的Stream。
传统实现写法
传统的做法是先过滤出Zebra实例,再进行类型转换,代码如下:
Stream<Zebra> zebraStream = animalStream .filter(Zebra.class::isInstance) .map(Zebra.class::cast);
Java 14的instanceof模式匹配
Java 14引入了instanceof模式匹配,在单个对象判断时可以直接绑定变量,写法更简洁:
if (animal instanceof Zebra zebra) { System.out.println(zebra.countStripes()); }
Stream流水线中的现有实现
那能不能把这种模式匹配语法应用到Stream的流水线操作中呢?目前有一种可行的实现,但写法十分繁琐丑陋:
Stream<Zebra> zebraStream = animalStream.map(animal -> { if (animal instanceof Zebra zebra) { return zebra; } return null; }) .filter(Objects::nonNull);
内容的提问来源于stack exchange,提问作者Dario Viva
相关产品推荐
相关产品推荐

