从DTO集合中收集智能数据

时间:2016-04-11 15:03:39

标签: java collections java-7

假设我们有一个包含一些字段的ExampleDTO列表,其中包括" name"领域。每次我想得到一个正确的字段列表,在这种情况下名称,我写代码如下:

private List<String> getNames(List<ExampleDTO> exampleDTOs) {
    List<String> names = new ArrayList<String>();
    for (ExampleDTO exampleDTO : exampleDTOs)
        names.add(exampleDTO.getName());
    return names;
}

...但我也注意到这种代码一遍又一遍地重复。

问题是:是否有任何智能方法可以帮助我减少产生的冗余代码量?

编辑:

我正在使用Java7申请。

2 个答案:

答案 0 :(得分:1)

使用Java 7,您可以使用Guava的FluentIterableFunction

List<ExampleDTO> exampleDTOs = ...;
List<String> names = FluentIterable.from(exampleDTOs)
   .transform(new Function<ExampleDTO, String>() {
       @Override
       public String apply(ExampleDTO dto) {
           return dto.getName();
       }
   })
   .toList();

请注意,尽管整个循环表示为单个表达式,但性能明显比循环更差,如果它更具可读性,那就非常有争议。

在升级到Java 8之前,我会坚持一个简单的循环。

在其中一个项目中,我曾经使用特殊注释标记所有这些循环,以便在执行Java 8升级时很容易找到所有这些位置。

使用Java 8,您可以使用Streams API:

List<ExampleDTO> exampleDTOs = ...;
List<String> names = exampleDTOs.stream()
    .map(dto -> dto.getName())
    .collect(Collectors.toList());

如果您不一定需要名称的列表,它可能会更短 - 在这种情况下,.collect(Collectors.toList())部分可能会被删除。

例如,您可以直接在流上迭代名称列表,如下所示:

exampleDTOs.stream()
    .map(dto -> dto.getName())
    .forEach(name -> System.out.println(name));

这只会打印所有名称,但您可以用其他任何内容替换System.out.println(name)

答案 1 :(得分:1)

在java 8中,你有一个名为public interface Function<T, R> { /** * Applies this function to the given argument. * @param t the function argument * @return the function result */ R apply(T t); } 的新接口,允许你映射一个值以获得其他东西,这里的想法是用Java 7实现相同的逻辑。

所以函数接口是:

private <R> List<R> getValues(List<ExampleDTO> exampleDTOs, Function<ExampleDTO, R> function) {
    List<R> values = new ArrayList<>();
    for (ExampleDTO exampleDTO : exampleDTOs)
        values.add(function.apply(exampleDTO));
    return values;
}

你的方法可能是这样的:

private static final Function<ExampleDTO, String> BY_NAME = new Function<ExampleDTO, String>() {
    public String apply(ExampleDTO e) {
        return e.getName();
    }
}

在您的情况下,您可以使用私有静态final变量将您的函数定义为匿名类,如下所示:

getValues(exampleDTOs, BY_NAME)

然后拨打exec('netstat', function (err, stdout, stderr) { console.log(stdout); console.log(stderr); cb(err); });