我有一个包含两列的列表,分别用于过滤、存储和productType,并且我需要生成一个合并了amount_1和amount_2的新列表。
List<stock> allStock = new ArrayList<>();
allStock.add(new stock("l1", "CAIXA", 1, 4));
allStock.add(new stock("l1", "CABIDE", 1, 0));
allStock.add(new stock("l1", "CAIXA", 5, 5));
allStock.add(new stock("l1", "CABIDE", 1, 0));
allStock.add(new stock("l2", "CAIXA", 1, 4));
allStock.add(new stock("l2", "CABIDE", 1, 0));
allStock.add(new stock("l2", "CAIXA", 5, 5));
allStock.add(new stock("l2", "CABIDE", 1, 1));
public stock(String store, String productType, Integer amount_1, Integer amount_2);
我需要一个新的列表,比如:
l1,CAIXA,6,9
l1,CABIDE,2,0
l2,CAIXA,6,9
l2,CABIDE,2,1
发布于 2019-09-04 01:52:34
可以将、Collectors.toMap
与在Stock
类中显式定义的mergeFunction
一起使用,如下所示:
List<Stock> resultingStocks = new ArrayList<>(allStock
.stream()
.collect(Collectors.toMap(st ->
Arrays.asList(st.getStore(), st.getProductType()),
Function.identity(),
this::mergeStocks)) // explicit merging behaviour
.values());
其中,mergeStocks
定义在与以下内容相同的类中:
Stock mergeStocks(Stock stock1, Stock stock2) {
return new Stock(stock1.getStore(), stock1.getProductType(), stock1
.getAmount_1() + stock2.getAmount_1(), stock1.getAmount_2() + stock2.getAmount_2());
}
发布于 2019-09-03 21:57:44
package ClassConcept;
import java.util.ArrayList;
import java.util.List;
public class stock {
String s1,s2;
int a1,a2;
stock(String s1, String s2, int a1, int a2){
this.s1 = s1;
this.s2 = s2;
this.a1 = a1;
this.a2 = a2;
}
}
public class ClassSpecifier {
public static void main(String[] args) {
List<stock> allStock = new ArrayList<>();
allStock.add(new stock("l1", "CAIXA", 1, 4));
allStock.add(new stock("l1", "CABIDE", 1, 0));
allStock.add(new stock("l1", "CAIXA", 5, 5));
allStock.add(new stock("l1", "CABIDE", 1, 0));
allStock.add(new stock("l2", "CAIXA", 1, 4));
allStock.add(new stock("l2", "CABIDE", 1, 0));
allStock.add(new stock("l2", "CAIXA", 5, 5));
allStock.add(new stock("l2", "CABIDE", 1, 1));
// create a new list
List<stock> allStockNew = new ArrayList<>();
// now yo have to add your logic of adding multiple stock in this. you can use while or any condition as per your need
// iterate through new list. if element present, add new value in this. else enter new entry.
for(int i = 0 ; i < allStockNew.size() ; i++) {
if (allStockNew.get(i).s2.euqals( "CAIXA") && allStockNew.get(i).s1.euqals( "l1")) {// your new stock name
stock s = allStockNew.get(i);
s.a1+=5;//new value
s.a2+=5; // new value
allStockNew.add(s);
}
else {
allStockNew.add(new stock("l1", "CABIDE", 1, 0));
}
}
}
}
发布于 2019-09-03 22:15:08
最简单的方法是:
import java.util.ArrayList;
import java.util.List;
/**
* @Author Jack <jackkobec>
*/
public class Test {
public static void main(String[] args) {
List<Stock> allStock = new ArrayList<>();
List<Stock> result = new ArrayList<>();
allStock.add(new Stock("l1", "CAIXA", 1, 4));
allStock.add(new Stock("l1", "CABIDE", 1, 0));
allStock.add(new Stock("l1", "CAIXA", 5, 5));
allStock.add(new Stock("l1", "CABIDE", 1, 0));
allStock.add(new Stock("l2", "CAIXA", 1, 4));
allStock.add(new Stock("l2", "CABIDE", 1, 0));
allStock.add(new Stock("l2", "CAIXA", 5, 5));
allStock.add(new Stock("l2", "CABIDE", 1, 1));
allStock.stream().map(stock -> stock.productType).distinct()
.forEach(distinctProductType -> {
allStock.stream().filter(stock -> stock.productType.equals(distinctProductType))
.reduce((stock1, stock2) -> {
if (stock1.store.equals(stock2.store)) {
result.add(
new Stock(
stock1.store,
stock1.productType,
stock1.amount_1 + stock2.amount_1,
stock1.amount_ + stock2.amount_));
}
return stock2;
});
});
result.forEach(stock -> System.out.println(
"store: " + stock.store + "\n"
+ "productType: " + stock.productType + "\n"
+ "amount_1: " + stock.amount_1 + "\n"
+ "amount_: " + stock.amount_ + "\n"
));
}
}
class Stock {
public String store;
public String productType;
public Integer amount_1;
public Integer amount_;
public Stock() {
}
public Stock(String store, String productType, Integer amount_1, Integer amount_) {
this.store = store;
this.productType = productType;
this.amount_1 = amount_1;
this.amount_ = amount_;
}
@Override
public String toString() {
return "Stock{" +
"store='" + store + '\'' +
", productType='" + productType + '\'' +
", amount_1=" + amount_1 +
", amount_=" + amount_ +
'}';
}
}
输出:
商店: l1 productType: CAIXA amount_1: 6 amount_:9
商店: l2 productType: CAIXA amount_1: 6 amount_:9
存储: l1 productType: CABIDE amount_1: 2 amount_:0
存储: l2 productType: CABIDE amount_1: 2 amount_:1
https://stackoverflow.com/questions/57779002
复制