java 8 stream对类别中的第一个项目执行Operation1,然后对类别中的所有项目执行Operation2

时间:2019-03-17 11:45:12

标签: java java-stream

给出类别列表以及类别中包含的项目列表

//Just example of structure:
List<Category> categories = getCategories();
List<Item> items = category.getItems();

使用Java流API,您如何对类别中的第一个子项目执行Operation1(),然后对类别中的所有项目执行Operation2()?

我想用最干净的代码来做。因此,我尝试在一个流中执行此操作,或者最好的方法是什么?

2 个答案:

答案 0 :(得分:1)

如果您坚持要这样做,那就可以了:

List<Category> categories = getCategories();

categories.forEach(category -> {
    List<Item> items = category.getItems();
    IntStream.range(0, items.size()).forEach(i -> {
                Item item = items.get(i);
                if (i == 0)
                    operation1(item);
                operation2(item);
            }
    );
});

但是,出于一般可读性考虑,我强烈建议您仅获取第一个元素(如果存在)并对其进行操作1,然后遍历其余元素(无论是否通过流)。

也就是说,如果您实际上没有列表开头,但是拥有真正的流式和非阻塞代码,那么这种方法就有些话了。这也是为什么我没有在类别的.stream()之前添加.forEach,而是从列表开始的原因。

答案 1 :(得分:0)

实际上没有干净的方法可以执行此操作,但是以下代码可以解决问题。使用AtomicBoolean跟踪是否已处理第一个元素

List<Category> categories = getCategories();
List<Item> items = category.getItems();
AtomicBoolean bool = new AtomicBoolean(true);

items.forEach(item -> {
         if (bool.get()) {
             bool.set(false);
             operation1(item);
         }
         operation2(item);
     });