Here is my solution based on the Item class that defines name and a price :
public class Item { public String name; public double price; Item(String name, double price) { this.name = name; this.price = price; } }
The requirement is to get only Item from a given List<Item> , which have different name and different price s, in the order in which they occur.
I catch this requirement to be different from the ItemWrapper class:
public class ItemWrapper { Item item; ItemWrapper(Item item) { this.item = item; } @Override public boolean equals(Object obj) { if (!(obj instanceof ItemWrapper)) return false; ItemWrapper other = (ItemWrapper) obj; return Objects.equals(item.name, other.item.name) || item.price == other.item.price; } @Override public int hashCode() { return 1; } }
Now we have everything to filter the given List<Item> elements:
List<Item> items = Arrays.asList( new Item("name-1", 100.00), new Item("name-1", 555.00), new Item("name-2", 100.00), new Item("name-2", 999.99), new Item("name-3", 100.00), new Item("name-4", 555.00), new Item("name-5", 999.99) );
in the following way:
items.stream() .map(item -> new ItemWrapper(item)) .distinct() .map(wrapper -> wrapper.item) .collect(Collectors.toList()); }
Selected Items:
- name = name-1, price = 100.0
- name = name-2, price = 999.99
- name = name-4, price = 555.0
source share