我有以下作業代碼使用一個值進行比較,但想與兩個值進行比較。我需要添加一個過濾器作為“getAddressID”以及getAction。有人可以幫我修改下面的代碼嗎?
List<Data> finalData = dataList.stream().collect(
Collectors.collectingAndThen(
Collectors.toCollection(
() -> new TreeSet<>(Comparator.comparing(Data::getAction))),
ArrayList::new))
public class TestCollection {
/**
* @param args
*/
public static void main(String[] args) {
List<Data> dataList = new ArrayList<Data>();
Data data1 = new Data("DELIVERED", "1112");
Data data2 = new Data("DELIVERED", "1113");
Data data3 = new Data("PICKEUP", "1112");
Data data4 = new Data("PICKEUP", "1112");
dataList.add(data1);
dataList.add(data2);
dataList.add(data3);
dataList.add(data4);
//Filer by Action
List<Data> finalData = dataList.stream().collect(Collectors.collectingAndThen(Collectors.toCollection(() -> new TreeSet<> (Comparator.comparing(Data::getAction))), ArrayList::new));
for(Data data : finalData) {
System.out.println(" Action " data.getAction() " Address ID " data.getAddressID());
}
}
}
結果是:“Action DELIVERED Address ID 1112”“Action PICKEUP Address ID 1112”
但我希望結果為:“DELIVERED Address ID 1112”“DELIVERED Address ID 1113”“PICKEUP Address ID 1112”
uj5u.com熱心網友回復:
您可以使用鏈接比較器thenComparing,即
new TreeSet<>(Comparator.comparing(Data::getAction).thenComparing(Comparator.comparing(Data::otherMethod))
uj5u.com熱心網友回復:
如果我猜對了,您正試圖通過組合這兩個屬性從您的串列中獲取不同的專案addressID & action。這是一個公認的答案,這要歸功于@Stuart Marks,它可以通過一個屬性來獲取不同的元素。可以進一步修改以解決您的用例,例如:
import java.util.ArrayList;
import java.util.Arrays;
import java.util.List;
import java.util.Map;
import java.util.concurrent.ConcurrentHashMap;
import java.util.function.Function;
import java.util.function.Predicate;
import java.util.stream.Collectors;
....
List<Data> dataList = // your data objects
List<Data> distinctData = dataList.stream()
.filter(distinctByKeys(Data::getAction, Data::getAddressID))
.collect(Collectors.toList());
該方法distinctByKeys可能看起來像的地方
private static <T> Predicate<T> distinctByKeys(final Function<? super T, ?>... keyExtractors) {
final Map<List<?>, Boolean> seen = new ConcurrentHashMap<>();
return t -> {
final List<?> keys = Arrays.stream(keyExtractors)
.map(ke -> ke.apply(t))
.collect(Collectors.toList());
return seen.putIfAbsent(keys, Boolean.TRUE) == null;
};
}
轉載請註明出處,本文鏈接:https://www.uj5u.com/caozuo/445240.html
