如何在 Java 8 循环 n+1 次中使用 forEach() 方法,但我的列表大小是随机的,如 n、n-1、n-2

How to use forEach() method in Java 8 loop n+1 time but my list size is random like n, n-1, n-2

如何在 Java 8 循环 n 时间内使用 forEach() 方法,但我的列表大小总是像 n-1, n-2, etc... 一样随机。如果列表大小小于 n 个数,则剩余值将是每个对象值的 zero/empty。

下面的例子我有一个 Data3 对象,它有 ID、年份、listOfCompanies 和值按照下面的代码最后我有一个 Data3 对象列表,我想为每个 java8 循环使用但我想为公司列表循环 8 次,如果没有值,则为每个对象设置空值。

我尝试使用 IntStream.range 函数,但它对我不起作用。

@lombok.Data
@AllArgsConstructor
static class Data3{
    int id;
    int year;
    List<String> listOfCompanies;
    double value;
}

List<String> list1 = new ArrayList<>();
list1.add("TCS"); list1.add("Cognizant");list1.add("Wipro");list1.add("Zensar");
list1.add("IBM");list1.add("Amdocs");
List<String> list2 = new ArrayList<>();
list2.add("TCS");list2.add("Cognizant");list2.add("Wipro");
List<String> list3 = new ArrayList<>();
list3.add("TCS");list3.add("Cognizant");list3.add("Wipro");list3.add("Zensar");
list3.add("IBM");
List<String> list4 = new ArrayList<>();
list4.add("TCS");list4.add("Cognizant");
Data3 d1 = new Data3(1, 1990, list1, 10);
Data3 d2 = new Data3(2, 1991, list2, 20);
Data3 d3 = new Data3(3, 1992, list3, 30);
Data3 d4 = new Data3(4, 1993, list4, 40);

List<Data3> listOfDataValues = new ArrayList<>();
listOfDataValues.add(d1);
listOfDataValues.add(d2);
listOfDataValues.add(d3);
listOfDataValues.add(d4);


listOfDataValues.stream().map(value -> new Data3(value.getId(), value.getYear(), IntStream.range(1, 8).mapToObj(index -> value.getListOfCompanies().get(index).isEmpty() ? "" : value.getListOfCompanies().get(index)), value.getValue()));

Expected OP: (result required to loop 8 times list of companies if no value then put Empty value )

[Test.Data3(id=1, year=1990, listOfCompanies=[TCS, Cognizant, Wipro, Zensar, IBM, Amdocs,"",""], value=10.0), 
Test.Data3(id=2, year=1991, listOfCompanies=[TCS, Cognizant, Wipro,"","","","",""], value=20.0), 
Test.Data3(id=3, year=1992, listOfCompanies=[TCS, Cognizant, Wipro, Zensar, IBM,"","",""], value=30.0),` 
Test.Data3(id=4, year=1993, listOfCompanies=[TCS, Cognizant,"","","","","",""], value=40.0)]
listOfDataValues.stream().forEach(value -> {
    return IntStream.range(1, 8).mapToObj(new Data3(value.getId(), value.getYear(), value.getListOfCompanies(), value.getValue()));
});

代码段错误:

1.in forEach 你不需要 return 任何东西

2.mapToObj需要IntFunction,所以需要取一个Integer作为输入

其实需要根据listOfCompanies的大小来补"",所以求补的数量是关键:

listOfDataValues.stream().forEach(value -> {
            int size = value.getListOfCompanies().size();
            IntStream.range(0, 8 - size).forEach(index->value.getListOfCompanies().add(""));
        });