假设我们有一个包含一些字段的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
申请。
答案 0 :(得分:1)
使用Java 7,您可以使用Guava的FluentIterable
和Function
:
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);
});