感觉 java 8 流和映射函数是如此冗长,它们并不是真正的改进。例如,我编写了一些使用集合生成另一个经过修改的集合的代码:
private List<DartField> getDartFields(Class<?> model) {
List<DartField> fields = new ArrayList<>();
for (Field field : model.getDeclaredFields()) {
if (!Modifier.isStatic(field.getModifiers())) {
fields.add(DartField.getDartField(field));
}
}
return fields;
}
这似乎是 java 8 流及其函数的理想用例,所以我这样重写了它:
private List<DartField> getDartFields(Class<?> model) {
return Arrays.asList(model.getDeclaredFields())
.stream()
.filter(field -> !Modifier.isStatic(field.getModifiers()))
.map(field -> DartField.getDartField(field))
.collect(Collectors.toList());
}
但我不确定我更喜欢那个。它有 236 个字符,而普通风格的 java 中有 239 个字符。它似乎没有或多或少的可读性。很高兴您不必声明ArrayList
,但需要打电话.collect(Collectors.toList())
and Arrays.asList
(取决于数据类型)也好不到哪去。
使用方面是否有一些实际的改进.stream()
像这样我就是不明白,或者这只是一种有趣的方式让那些不懂函数式编程的同事陷入困境?
我想如果我动态地传递过滤器或映射 lambdas 它会很有用,但如果你不需要这样做......
问题是你没有使用Stream
API 始终如一地。您将用例限制为可以最好地描述为“实际上不使用Stream
API”,因为您坚持返回Collection
。这尤其荒谬,因为它是private
方法,这样您也完全能够适应调用者。
考虑将方法更改为
private Stream<DartField> getDartFields(Class<?> model) {
return Stream.of(model.getDeclaredFields())
.filter(field -> !Modifier.isStatic(field.getModifiers()))
.map(field -> DartField.getDartField(field));
}
看看是什么来电者其实想做。通常他们不需要Collection
作为目的本身,但想要执行一个动作甚至更多可以链接的操作,例如打印它们:
getDartFields(Foo.class).forEach(System.out::println);
最有趣的特征是流的惰性本质,这意味着getDartFields
返回,尚未执行任何操作,如果您使用类似的操作findFirst
,不需要处理所有元素。如果您退回,您将失去此功能Collection
包含所有元素。
这也适用于多步骤处理,其中处理普通列表意味着必须为每个步骤创建一个新列表并用结果填充。
本文内容由网友自发贡献,版权归原作者所有,本站不承担相应法律责任。如您发现有涉嫌抄袭侵权的内容,请联系:hwhale#tublm.com(使用前将#替换为@)