在Java 8中,如何Stream通过检查每个对象的属性的清晰度来使用API 过滤集合?
例如,我有一个Person对象列表,我想删除具有相同名称的人,
persons.stream().distinct();
Run Code Online (Sandbox Code Playgroud)
将使用Person对象的默认相等检查,所以我需要像,
persons.stream().distinct(p -> p.getName());
Run Code Online (Sandbox Code Playgroud)
不幸的是,该distinct()方法没有这种过载.如果不修改类中的相等性检查,Person是否可以简洁地执行此操作?
输入List<Item>按分数排序,Item如下所示:
class Item {
double score;
String category;
String author;
String poi;
}
Run Code Online (Sandbox Code Playgroud)
现在我需要在这些限制下从数组中选择10个得分最高的元素:
poiauthorcategory.并且来自同一子序列的任何子序列的长度category不应超过2.如果没有满足上述规则的子序列,只需返回前10个元素.
现在,我直接迭代List,并用三个HashMap<String, Integer>来存储每个的外观cagetory/poi/author.我List<Item> selected用来存储结果.
poi则将丢弃新元素.author则将丢弃新元素.category则将丢弃新元素.selected具有此category,那么新元素将被丢弃.它在输入很大时有效,但是当输入相对较小时,它不起作用.例如,输入时
那我的解决方案就是
Item3丢弃,因为它具有相同category的Item1和Item2Item4丢弃,因为它有相同 …实际上,我知道减少重复distinct()或分配的List方法Set,但我有一些不同的问题.如何解决JAVA 8中使用流的问题以下的智能方式或可能StreamEx?
假设我们在List中有一个对象
A, A, A, B, B, A, A, A, C, C, C, A, A, B, B, A
现在我需要
A, B, A, C, A, B, A
所以复制被删除了,但只有当下一个出现时,但如果旁边是不同的对象则应该保留.我尝试了一些解决方案但是丑陋,而且不易阅读.
给定具有ID,姓名和IQ的员工列表:
List<Employee> employee = Arrays.asList(new Employee(1, "John", 80), new Employee(1, "Bob", 120), Employee(1, "Roy", 60), new Employee(2, "Alice", 100));
Run Code Online (Sandbox Code Playgroud)
我想输出:
[Employee{id=1, name='Bob', iq=120}, Employee{id=2, name='Alice', iq=100}]
Run Code Online (Sandbox Code Playgroud)
因此,基于员工的id属性从列表中删除重复项,并出于明显的原因选择智商最高的员工。:)
特别是,我对调整此解决方案感兴趣,该解决方案仅根据id删除重复项:
import static java.util.Comparator.comparingInt;
import static java.util.stream.Collectors.collectingAndThen;
import static java.util.stream.Collectors.toCollection;
...
List<Employee> unique = employee.stream()
.collect(collectingAndThen(toCollection(() -> new TreeSet<>(comparingInt(Employee::getId))),
ArrayList::new));
Run Code Online (Sandbox Code Playgroud)
有办法吗?
我在下面有一个类,想要删除包含相同名称的重复者,如何使用Java8 Lambda,预期List包含p1,p3,如下所示.
public class Person {
public int id;
public String name;
public String city;
public int getId() {
return id;
}
public void setId(int id) {
this.id = id;
}
public String getName() {
return name;
}
public void setName(String name) {
this.name = name;
}
public String getCity() {
return city;
}
public void setCity(String city) {
this.city = city;
}
}
Run Code Online (Sandbox Code Playgroud)
import java.util.ArrayList;
import java.util.List;
public class Testing {
public static void main(String[] args) { …Run Code Online (Sandbox Code Playgroud) 这是我的第二个清单,其中包含超过数百万个项目。两者都有相同 ID 的相同项目。ID 位于字符串中。我只需要ID不同的项目。我就是这样做的。但我确信一定有一个更好且持久的解决方案:-
List<Transaction> differentList = new ArrayList<>();
for(Transaction tx : foundTransactions ){
for(Transaction aTx : ArchivedTransactions)
{
if(!tx.getId().equalsIgnoreCase(aTx.getId()) ){
differentList .add(tx);
}
}
}
Run Code Online (Sandbox Code Playgroud)
我尝试使用流,但我做不到。我想使用stream API应该会更好。请建议我任何改进。
我试图从基于两个属性的对象列表中删除重复项,这个问题类似于下面的链接,但是我试图使用Java 8功能基于两个属性找到唯一性。
示例:我有一个自定义对象,其中两个属性一起构成唯一的条目
说列出客户
customerName和DOB一起进行唯一输入。
使用两个属性的谓词来识别区别的任何解决方案。像下面的链接,他们对一个属性有解决方案。 Java 8按属性区分
类似的问题: