Oleg's answer是絕對正確的,我在這裏張貼做同樣的事情的其他方式的基礎上,他使用訪問順序LinkedHashMap
的想法。
沒有流:
Map<Integer, Integer> map = new LinkedHashMap<>(16, 0.75f, true); // access order
Arrays.asList(1, 2, 3, 1, 4, 5)
.forEach(e -> map.put(e, e)); // just put
List<Integer> list1 = new ArrayList<>(map.values()); // discard the map
System.out.println(list1); // [2, 3, 1, 4, 5]
有了流,使用自定義收集:
List<Integer> list2 = Stream.of(1, 2, 3, 1, 4, 5)
.collect(Collector.of(
() -> new LinkedHashMap<Integer, Integer>(16, 0.75f, true),
(m, e) -> m.put(e, e),
(m1, m2) -> { m1.putAll(m2); return m1; },
m -> new ArrayList<>(m.values())));
System.out.println(list2); // [2, 3, 1, 4, 5]
注:如在評論中指出的霍爾格,它使用Map.values()
而不是Map.keySet()
創建很重要結果列表。這是因爲當使用m.put(e, e)
時,如果在地圖中已經存在具有相同密鑰的條目,則舊值將被替換爲新值,但密鑰保持不變,即舊值。
您是否嘗試顛倒訂單,刪除重複,然後再次顛倒訂單? –
反向流。採取獨特的。相反的結果。 – talex
我嚴重懷疑你可以使用流來實現這一點。這需要流功能「向前看」,以查看流中稍後是否出現副本,或者返回並追溯刪除已通過輸出的項目。這些都不是真正屬於溪流'性格'的一部分。 – ajb