gpt4 book ai didi

java 8 如何获得多个属性的不同列表

转载 作者:塔克拉玛干 更新时间:2023-11-03 03:48:06 26 4
gpt4 key购买 nike

如何从对象列表中获取不同的(不同的基于两个属性的)列表。例如,让有属性名称和价格的对象列表。现在如何获得具有不同名称或价格的列表。
假设

list<xyz> l1 = getlist(); // getlist will return the list.

现在让 l1 具有以下属性(名称,价格):-
n1, p1
n1, p2
n2, p1
n2, p3

现在过滤后的列表应该是-
n1, p1
n2, p3

我试过这样解决 -

public List<xyz> getFilteredList(List<xyz> l1) {

return l1
.stream()
.filter(distinctByKey(xyz::getName))
.filter(distinctByKey(xyz::getPrice))
.collect(Collectors.toList());
}

private static <T> Predicate<T> distinctByKey(Function<? super T, Object> keyExtractor) {
Map<Object,Boolean> seen = new ConcurrentHashMap<>();
return t -> seen.putIfAbsent(keyExtractor.apply(t), Boolean.TRUE) == null;
}

现在的问题是,当我对名称进行过滤时,返回的列表将是 -
n1, p1
n2, p1

然后它会对返回的价格运行过滤器 -
n1, p1

这不是预期的结果。

最佳答案

Stuart Marks' answer 几乎一字不差:

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;

class Class {

public static <T> Predicate<T> distinctByKey(Function<? super T, Object> keyExtractor) {
Map<Object, Boolean> seen = new ConcurrentHashMap<>();
return t -> seen.putIfAbsent(keyExtractor.apply(t), Boolean.TRUE) == null;
}

private static List<Pojo> getList() {
return Arrays.asList(
new Pojo("123", 100),
new Pojo("123", 100),
new Pojo("123", 100),
new Pojo("456", 200)
);
}

public static void main(String[] args) {

System.out.println(getList().stream()
// extract a key for each Pojo in here.
// concatenating name and price together works as an example
.filter(distinctByKey(p -> p.getName() + p.getPrice()))
.collect(Collectors.toList()));
}

}

class Pojo {
private final String name;
private final Integer price;

public Pojo(final String name, final Integer price) {
this.name = name;
this.price = price;
}

public String getName() {
return name;
}

public Integer getPrice() {
return price;
}

@Override
public String toString() {
final StringBuilder sb = new StringBuilder("Pojo{");
sb.append("name='").append(name).append('\'');
sb.append(", price=").append(price);
sb.append('}');
return sb.toString();
}
}

这个主要方法产生:

[Pojo{name='123', price=100}, Pojo{name='456', price=200}]

编辑

根据 Eugene 的提示将价格设置为 int

注意:如果你想充实它,你可以使用更有趣的东西作为键:

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;

class Class {

public static <T> Predicate<T> distinctByKey(Function<? super T, Object> keyExtractor) {
Map<Object, Boolean> seen = new ConcurrentHashMap<>();
return t -> seen.putIfAbsent(keyExtractor.apply(t), Boolean.TRUE) == null;
}

private static List<Pojo> getList() {
return Arrays.asList(
new Pojo("123", 100),
new Pojo("123", 100),
new Pojo("123", 100),
new Pojo("456", 200)
);
}

private static class NameAndPricePojoKey {
final String name;
final int price;

public NameAndPricePojoKey(final Pojo pojo) {
this.name = pojo.getName();
this.price = pojo.getPrice();
}

@Override
public boolean equals(final Object o) {
if (this == o) return true;
if (o == null || getClass() != o.getClass()) return false;

final NameAndPricePojoKey that = (NameAndPricePojoKey) o;

if (price != that.price) return false;
return name != null ? name.equals(that.name) : that.name == null;

}

@Override
public int hashCode() {
int result = name != null ? name.hashCode() : 0;
result = 31 * result + price;
return result;
}
}

public static void main(String[] args) {

System.out.println(getList().stream()
// extract a key for each Pojo in here.
.filter(distinctByKey(NameAndPricePojoKey::new))
.collect(Collectors.toList()));
}

}

class Pojo {
private String name;
private Integer price;
private Object otherField1;
private Object otherField2;

public Pojo(final String name, final Integer price) {
this.name = name;
this.price = price;
}

public String getName() {
return name;
}

public void setName(final String name) {
this.name = name;
}

public Integer getPrice() {
return price;
}

public void setPrice(final Integer price) {
this.price = price;
}

public Object getOtherField1() {
return otherField1;
}

public void setOtherField1(final Object otherField1) {
this.otherField1 = otherField1;
}

public Object getOtherField2() {
return otherField2;
}

public void setOtherField2(final Object otherField2) {
this.otherField2 = otherField2;
}

@Override
public boolean equals(final Object o) {
if (this == o) return true;
if (o == null || getClass() != o.getClass()) return false;

final Pojo pojo = (Pojo) o;

if (name != null ? !name.equals(pojo.name) : pojo.name != null) return false;
if (price != null ? !price.equals(pojo.price) : pojo.price != null) return false;
if (otherField1 != null ? !otherField1.equals(pojo.otherField1) : pojo.otherField1 != null) return false;
return otherField2 != null ? otherField2.equals(pojo.otherField2) : pojo.otherField2 == null;

}

@Override
public int hashCode() {
int result = name != null ? name.hashCode() : 0;
result = 31 * result + (price != null ? price.hashCode() : 0);
result = 31 * result + (otherField1 != null ? otherField1.hashCode() : 0);
result = 31 * result + (otherField2 != null ? otherField2.hashCode() : 0);
return result;
}

@Override
public String toString() {
final StringBuilder sb = new StringBuilder("Pojo{");
sb.append("name='").append(name).append('\'');
sb.append(", price=").append(price);
sb.append(", otherField1=").append(otherField1);
sb.append(", otherField2=").append(otherField2);
sb.append('}');
return sb.toString();
}
}

关于java 8 如何获得多个属性的不同列表,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/42817884/

26 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com