将增强型循环转换为Java 8 Streams,filter - forEach

时间:2017-08-07 15:04:56

标签: java java-8 java-stream

我正在尝试学习Java 8.有没有办法将下面的方法转换为Java 8 Streams,filterforEach。如果是这样,怎么样?

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的教程,但不确定如何实现它。感谢。

编辑:我在方法中添加了一个列表。

4 个答案:

答案 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());