感觉像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()
这种我没有得到的实用改进吗?或者这只是一种有趣的方式,使不了解函数编程的任何同事陷入困境?
我想如果我动态地绕过过滤器或地图lambda,这将很有用,但是如果您不需要这样做...
问题是,你没有使用Stream
API 一致。您将用例限制为可以最好地描述为“实际上未使用Stream
API”的某种用例,因为您坚持要返回a 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
包含所有元素的,则将失去此功能。
这也适用于多步骤处理,其中处理普通列表意味着必须为每个步骤创建一个新列表,并在其中填充结果。
本文收集自互联网,转载请注明来源。
如有侵权,请联系 [email protected] 删除。
我来说两句