JavaRush /Java 博客 /Random-ZH /别再写循环了!使用 Java 8 集合的 10 种最佳方法

别再写循环了!使用 Java 8 集合的 10 种最佳方法

已在 Random-ZH 群组中发布
我认为没有必要向JavaRush的学生解释什么是集合以及它们的用途。不过,第 8 版发布后,很多原本需要 6-7 行代码的基本操作被简化到了最少。言归正传,这里列出了 10 种最佳 Java8 集合框架技术,它们将为您节省大量时间和空间! 别再写循环了! Java 8 中处理集合的 10 种最佳方法 - 1大家好,朋友们!如您所知,习惯是第二天性。而且已经习惯了写作,for (int i = 0; i <......)我根本不想重新学习它(特别是因为这个设计非常简单易懂)。然而,在循环内部,我们经常重复相同的基本操作,而我们确实希望消除这些重复。随着 Java8 的发布,Oracle 决定帮助我们解决这个问题。以下是 10 种最佳收集方法,可以为您节省大量时间和代码。

1. Iterable.forEach(Consumer<? super T> 操作)

名字足以说明问题。迭代传递的集合并action为每个元素执行 lambda 表达式。
List <Integer> numbers = new ArrayList<>(Arrays.asList(1,2,3,4,5,6,7));
numbers.forEach(s -> System.out.print(s + " "));
1 2 3 4 5 6 7

2. Collection.removeIf(Predicate<? super E> 过滤器)

也没什么复杂的。该方法迭代集合并删除那些匹配的元素filter
List <Integer> numbers = new ArrayList<>(Arrays.asList(1,2,3,4,5,6,7));
numbers.removeIf(s -> s > 5);
 numbers.forEach(s -> System.out.print(s + " "));
在一行中,我们从列表中删除所有大于 5 的数字。

3. Map.forEach(BiConsumer<? super K, ? super V> 动作)

该方法forEach不仅适用于实现接口的类Collection,也适用于Map.
Map <String, String> books = new HashMap<>();
books.put("Война и мир", "Лев Толстой");
books.put("Преступление и наказание", "Федор Достоевский");
books.put("Философия Java", "Брюс Эккель");
books.put("Братья Карамазовы", "Федор Достоевский");
books.put("Властелин Колец", "Джон Толкин");
books.forEach((a,b) -> System.out.println("Название книги: " + a + ". Author: " + b));
Название книги: Братья Карамазовы. Author: Федор Достоевский
Название книги: Философия Java. Author: Брюс Эккель
Название книги: Преступление и наказание. Author: Федор Достоевский
Название книги: Война и мир. Author: Лев Толстой
Название книги: Властелин Колец. Author: Джон Толкин

4. Map.compute(K key,BiFunction<? super K, ? super V, ? extends V> remappingFunction)

它看起来有点吓人,但实际上很简单,就像之前的所有一样。对于指定的键key,此方法将值设置为函数的结果remappingFunction。例如:
Map <String, String> books = new HashMap<>();
books.put("Война и мир", "Лев Толстой");
books.put("Преступление и наказание", "Федор Достоевский");
books.put("Философия Java", "Брюс Эккель");
books.put("Братья Карамазовы", "Федор Достоевский");
books.put("Властелин Колец", "Джон Толкин");
books.forEach((a,b) -> System.out.println("Название книги: " + a + ". Author: " + b));

books.compute("Философия Java", (a,b) -> b+", крутой чувак");
System.out.println("_______________________");
books.forEach((a,b) -> System.out.println("Название книги: " + a + ". Author: " + b));
Название книги: Братья Карамазовы. Author: Федор Достоевский
Название книги: Философия Java. Author: Брюс Эккель
Название книги: Преступление и наказание. Author: Федор Достоевский
Название книги: Война и мир. Author: Лев Толстой
Название книги: Властелин Колец. Author: Джон Толкин
_______________________
Название книги: Братья Карамазовы. Author: Федор Достоевский
Название книги: Философия Java. Author: Брюс Эккель, крутой чувак
Название книги: Преступление и наказание. Author: Федор Достоевский
Название книги: Война и мир. Author: Лев Толстой
Название книги: Властелин Колец. Author: Джон Толкин
《 Java哲学》 的作者绝对很酷!:)

5. Map.computeIfAbsent(K key, Function<? super K, ? extends V> mappingFunction)

该方法将向Map添加一个新元素,但前提是具有相同键的元素不存在。函数执行的结果value将赋给它mappingFunction。如果具有此类键的元素已经存在,则它不会被覆盖,而是保留在原处。让我们回到书本并尝试一种新方法:
Map <String, String> books = new HashMap<>();
books.put("Война и мир", "Лев Толстой");
books.put("Преступление и наказание", "Федор Достоевский");
books.put("Философия Java", "Брюс Эккель");
books.put("Братья Карамазовы", "Федор Достоевский");
books.put("Властелин Колец", "Джон Толкин");

books.computeIfAbsent("Гарри Поттер и узник Азкабана", b -> getHarryPotterAuthor());
books.forEach((a,b) -> System.out.println("Название книги: " + a + ". Author: " + b));
我们的职能mappingFunction
public static String getHarryPotterAuthor() {
        return "Джоан Роулинг";
    }
这是新书:
Название книги: Братья Карамазовы. Author: Федор Достоевский
Название книги: Философия Java. Author: Брюс Эккель
Название книги: Преступление и наказание. Author: Федор Достоевский
Название книги: Война и мир. Author: Лев Толстой
Название книги: Гарри Поттер и узник Азкабана. Author: Джоан Роулинг
Название книги: Властелин Колец. Author: Джон Толкин

6. Map.computeIfPresent(K key, BiFunction<? super K, ? super V, ? extends V> remappingFunction)

原理与 相同,Map.compute()但只有当带有键的元素key已经存在时才会执行所有计算。
Map <String, String> books = new HashMap<>();
books.put("Война и мир", "Лев Толстой");
books.put("Преступление и наказание", "Федор Достоевский");
books.put("Философия Java", "Брюс Эккель");
books.put("Братья Карамазовы", "Федор Достоевский");
books.put("Властелин Колец", "Джон Толкин");

books.computeIfPresent("Евгений Онегин", (a,b) -> b="Александр Пушкин");
System.out.println("_________________");
books.forEach((a,b) -> System.out.println("Название книги: " + a + ". Author: " + b));
books.computeIfPresent("Братья Карамазовы", (a,b) -> b="Александр Пушкин");
System.out.println("_________________");
books.forEach((a,b) -> System.out.println("Название книги: " + a + ". Author: " + b));
当第一次调用该函数时,没有发生任何变化,因为Map我们的书中没有标题为“叶甫盖尼·奥涅金”的书。但该节目第二次将《卡拉马佐夫兄弟》一书的作者改为“亚历山大·普希金”。结论:
_________________
Название книги: Братья Карамазовы. Author: Федор Достоевский
Название книги: Философия Java. Author: Брюс Эккель
Название книги: Преступление и наказание. Author: Федор Достоевский
Название книги: Война и мир. Author: Лев Толстой
Название книги: Властелин Колец. Author: Джон Толкин
_________________
Название книги: Братья Карамазовы. Author: Александр Пушкин
Название книги: Философия Java. Author: Брюс Эккель
Название книги: Преступление и наказание. Author: Федор Достоевский
Название книги: Война и мир. Author: Лев Толстой
Название книги: Властелин Колец. Author: Джон Толкин

7.Map.getOrDefault(对象键, V defaultValue)

返回与 key 对应的值key。如果该键不存在,则返回默认值。
Map <String, String> books = new HashMap<>();
books.put("Война и мир", "Лев Толстой");
books.put("Преступление и наказание", "Федор Достоевский");
books.put("Философия Java", "Брюс Эккель");
books.put("Братья Карамазовы", "Федор Достоевский");
books.put("Властелин Колец", "Джон Толкин");

String igor = books.getOrDefault("Слово о полку Игореве", "Неизвестный автор");
System.out.println(igor);
非常舒服:
Неизвестный автор

8. Map.merge(K key, V value, BiFunction<? super V, ? super V, ? extends V> remappingFunction)

我什至没有尝试计算此方法将为您节省多少行代码。
  • 如果您的密钥中不存在Map该密钥,或者该密钥相等,则该方法会添加。keyvaluenullMapkey-value
  • 如果键Key存在并且确实存在,则value != null该方法将其更改value为执行传递的函数的结果remappingFunction
  • 如果remappingFunction返回nullkey则将从集合中删除。
Map <String, String> books = new HashMap<>();
books.put("Война и мир", "Лев Толстой");
books.put("Преступление и наказание", "Федор Достоевский");
books.put("Философия Java", "Брюс Эккель");
books.put("Братья Карамазовы", "Федор Достоевский");
books.put("Властелин Колец", "Джон Толкин");

books.merge("Философия Java", "Брюс Эккель", (a, b) -> b +  " и кто-то там еще");
books.forEach((a,b) -> System.out.println("Название:" + a + ". Author: " + b));
结论:
Название:Братья Карамазовы. Author: Федор Достоевский
Название:Философия Java. Author: Брюс Эккель и кто-то там еще
Название:Преступление и наказание. Author: Федор Достоевский
Название:Война и мир. Author: Лев Толстой
Название:Властелин Колец. Author: Джон Толкин
*对不起布鲁斯*

9.Map.putIfAbsent(K键,V值)

以前,要添加一对(Map如果不存在),您必须执行以下操作:
Map <String, String> map = new HashMap<>();
if (map.get("Властелин Колец") == null)
    map.put("Властелин Колец", "Джон Толкин");
现在一切都变得简单多了:
Map<String, String> map = new HashMap<>();
map.putIfAbsent("Властелин Колец", "Джон Толкин");

10.Map.replace 和 Map.replaceAll()

名单上的最后一个,但并非最不重要。 —如果存在这样的键,Map.replace(K key, V newValue则将键值替换key为。newValue如果没有,则什么也不会发生。 Map.replace(K key, V oldValue, V newValue)- 做同样的事情,但前提是当前key值为oldValueMap.replaceAll(BiFunction<? super K, ? super V, ? extends V> function)——value用函数执行的结果替换所有值function。例如:
Map <String, String> books = new HashMap<>();
books.put("Война и мир", "Лев Толстой");
books.put("Преступление и наказание", "Федор Достоевский");
books.put("Философия Java", "Брюс Эккель");
books.put("Братья Карамазовы", "Федор Достоевский");
books.put("Властелин Колец", "Джон Толкин");

books.replace("Братья Карамазовы", "Брюс Эккель", "Джон Толкин");
books.forEach((a,b) -> System.out.println("Название:" + a + ". Author: " + b));
Название:Братья Карамазовы. Author: Федор Достоевский
Название:Философия Java. Author: Брюс Эккель
Название:Преступление и наказание. Author: Федор Достоевский
Название:Война и мир. Author: Лев Толстой
Название:Властелин Колец. Author: Джон Толкин
不工作!卡拉马佐夫兄弟密钥的当前值是费奥多尔·陀思妥耶夫斯基,而不是布鲁斯·埃克尔,因此没有任何变化。
Map <String, String> books = new HashMap<>();
books.put("Война и мир", "Лев Толстой");
books.put("Преступление и наказание", "Федор Достоевский");
books.put("Философия Java", "Брюс Эккель");
books.put("Братья Карамазовы", "Федор Достоевский");
books.put("Властелин Колец", "Джон Толкин");

books.replaceAll((a,b) -> getCoolWriter());
books.forEach((a,b) -> System.out.println("Название:" + a + ". Author: " + b));
public static String getCoolWriter() {
        return "Крутой писатель";
    }
Название:Братья Карамазовы. Author: Крутой писатель
Название:Философия Java. Author: Крутой писатель
Название:Преступление и наказание. Author: Крутой писатель
Название:Война и мир. Author: Крутой писатель
Название:Властелин Колец. Author: Крутой писатель
轻松更改整个地图的值,无需任何复杂的构造!PS 适应新事物总是很困难,但这些变化确实很好。无论如何,我的代码的某些部分现在肯定不像以前那样像意大利面条了:)如果您喜欢这篇文章并且希望看到新的文章,请不要忘记通过单击“喜欢”来支持作者的竞赛,或者更好的是,“喜欢”:)祝你学习顺利!
评论
TO VIEW ALL COMMENTS OR TO MAKE A COMMENT,
GO TO FULL VERSION