Java 8流和地图值得吗?

比:

感觉像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,这将很有用,但是如果您不需要这样做...

霍尔格:

问题是,你没有使用StreamAPI 一致您将用例限制为可以最好地描述为“实际上未使用StreamAPI”的某种用例,因为您坚持要返回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] 删除。

编辑于
0

我来说两句

0 条评论
登录 后参与评论

相关文章