Warning: file_get_contents(/data/phpspider/zhask/data//catemap/1/oracle/9.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
java 8对类别中的第一个项目执行操作1,然后对类别中的所有项目执行操作2_Java_Java Stream - Fatal编程技术网

java 8对类别中的第一个项目执行操作1,然后对类别中的所有项目执行操作2

java 8对类别中的第一个项目执行操作1,然后对类别中的所有项目执行操作2,java,java-stream,Java,Java Stream,给定类别列表以及类别中包含的项目列表 //Just example of structure: List<Category> categories = getCategories(); List<Item> items = category.getItems(); //结构示例: 列表类别=getCategories(); 列表项=category.getItems(); 使用Java流API,如何对类别中的第一个子项执行操作1(),然后对类别中的所有项执行操作2()

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

//Just example of structure:
List<Category> categories = getCategories();
List<Item> items = category.getItems();
//结构示例:
列表类别=getCategories();
列表项=category.getItems();
使用Java流API,如何对类别中的第一个子项执行操作1(),然后对类别中的所有项执行操作2()


我想用最干净的代码来做。所以我试着在一条流中完成,或者说什么是最好的方法呢?

如果你坚持这样做,这就可以做到:

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);
            }
    );
});
List categories=getCategories();
类别。forEach(类别->{
列表项=category.getItems();
IntStream.range(0,items.size()).forEach(i->{
Item=items.get(i);
如果(i==0)
操作1(项目);
操作2(项目);
}
);
});
但是,为了一般的可读性,我强烈建议只获取第一个元素(如果存在)并对其执行操作1,然后迭代其余元素(无论是否通过流)


这就是说,如果您实际上没有列表,但有真正的流式和非阻塞代码,那么对于这种方法有一些话要说。这也是为什么我没有在
.forEach
之前添加
.stream()。使用
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);
     });
List categories=getCategories();
列表项=category.getItems();
AtomicBoolean布尔=新的AtomicBoolean(真);
项目。forEach(项目->{
if(bool.get()){
bool.set(假);
操作1(项目);
}
操作2(项目);
});

我想用最干净的代码来做。所以我试着在一条流中做这件事:这些陈述是相互矛盾的。这里需要两个独立的操作。做第一个,不需要做任何迭代。第二个需要迭代。保持简单。即使对于第二个操作,也不需要流。您的意思是
getCategories().stream().map(Category::getItems).forEach()
?getCategories()方法用于什么?它提供了分类。然后,您可以使用诸如getCategories().stream().map(Category::getItems).map(执行操作)之类的方法阅读问题(JB除外)。他不想对每件事都执行相同的操作。@Frederik我将你问题中的
categories
重写为
category
,因为我非常怀疑你试图调用java列表中的方法
getItems()
。如果这是你的意图,请随时回复。