我正在尝试学习Java 8.有没有办法将下面的方法转换为Java 8 Streams,filter
和forEach
。如果是这样,怎么样?
protected void isValidId(CarModel model, List<String> errors) throws DataAccessException {
CarStyle[] styles = model.getStyles();
for(CarStyle style : styles){
if(!style.isModels()){
if(style.getStyleId() > 99){
errors.add(INVALID_ID + ", Id:" + style.getStyleId());
}
}
}
}
我阅读了一些关于java 8的教程,但不确定如何实现它。感谢。
编辑:我在方法中添加了一个列表。
答案 0 :(得分:4)
您的嵌套if
语句等于filter
。稍后,您可以将过滤后的元素转换为错误字符串并将其收集到现有集合中:
Arrays.stream(model.getStyles())
.filter(s -> !s.isModels() && s.getStyleId() > 99)
.map(s -> String.format("%s, Id:%d", INVALID_ID, s.getStyleId()))
.forEach(errors::add);
或......更合理的选择是返回错误列表而不是void
:
return Arrays.stream(model.getStyles())
.filter(s -> !s.isModels() && s.getStyleId() > 99)
.map(s -> String.format("%s, Id:%d", INVALID_ID, s.getStyleId()))
.collect(Collectors.toList());
答案 1 :(得分:2)
protected void isValidId(CarModel model) throws DataAccessException {
CarStyle[] styles = model.getStyles();
Stream<CarStyle> stylesStream = Arrays.stream(styles);
stylesStream.filter(style -> !style.isModels())
.filter(style.getStyleId() > 99)
.forEach(System.out::println)
}
上面的代码片段将打印出符合要求的所有样式。
修改强>
protected void isValidId(CarModel model, List<String> errors) throws DataAccessException {
CarStyle[] styles = model.getStyles();
Stream<CarStyle> stylesStream = Arrays.stream(styles);
stylesStream.filter(style -> !style.isModels())
.filter(style -> style.getStyleId() > 99)
.forEach( s-> errors.add(INVALID_ID + ", Id:" + s.getStyleId())
}
此代码段将与您的代码完全相同。
我推荐你这个教程: http://winterbe.com/posts/2014/07/31/java8-stream-tutorial-examples/
答案 2 :(得分:1)
假设方法调用没有副作用,你就不要考虑在for循环中编辑数组(这也不能解决你问题中的方法),你可以像这样重写你的代码:
protected void isValidId(CarModel model)
{
CarStyle styles[] = model.getStyles();
Arrays.stream(styles)
.filter(style -> !style.isModels() && style.getStyleId() > 99)
.forEach(style -> {
});
}
答案 3 :(得分:1)
我不知道你的代码的结果应该是什么,所以我假设你只想过滤那些匹配条件的CarStyle
。
你可以这样写:
CarStyle[] styles = model.getStyles();
return Stream.of(styles)
.filter(style -> !style.isModels() && style.getStyleId() > 99)
.map(style -> INVALID_ID.concat(", Id:").concat(style.getStyleId()))
.collect(Collectors.toList());