关于java17:从头学Java17Stream-API二结合RecordOptional

Stream APIStream API 是依照map/filter/reduce办法解决内存中数据的最佳工具。本系列教程由Record讲起,而后联合Optional,探讨collector的设计。 应用Record对不可变数据进行建模Java 语言为您提供了几种创立不可变类的办法。可能最间接的是创立一个蕴含final字段的final类。上面是此类的示例。 public final class Point { private final int x; private final int y; public Point(int x, int y) { this.x = x; this.y = y; }}编写这些元素后,须要为字段增加拜访器。您还将增加一个 toString)() 办法,可能还有一个 equals)() 以及一个 hashCode()) 办法。手写所有这些十分乏味且容易出错,侥幸的是,您的 IDE 能够为您生成这些办法。 如果须要通过网络或文件系统将此类的实例从一个应用程序传送到另一个应用程序,则还能够思考使此类可序列化。如果这样做,还要增加一些无关如何序列化的信息。JDK 为您提供了几种管制序列化的办法。 最初,您的Point类可能有一百多行,次要是IDE 生成的代码,只是为了对须要写入文件的两个整数不可变集进行建模。 Record曾经增加到 JDK 以扭转这所有。只需一行代码即可为您提供所有这些。您须要做的就是申明record的状态;其余部分由编译器为您生成。 呼叫Record声援Record可帮忙您使此代码更简略。从 Java SE 14 开始,您能够编写以下代码。 public record Point(int x, int y) {}这一行代码为您创立以下元素。 它是一个不可变的类,有两个字段:x和y它有一个规范的构造函数,用于初始化这两个字段。toString)()、equals)() 和 hashCode()) 办法是由编译器为您创立的,其默认行为与 IDE 将生成的内容绝对应。如果须要,能够通过增加本人的实现来批改此行为。它能够实现Serializable接口,以便您能够通过网络或通过文件系统发送到其余应用程序。序列化和反序列化record的形式遵循本教程开端介绍的一些非凡规定。record使创立不可变的数据集变得更加简略,无需任何 IDE 的帮忙。升高了谬误的危险,因为每次批改record的组件时,编译器都会自动更新 equals()) 和 hashCode()) 办法。 ...

July 5, 2023 · 12 min · jiezi

关于java17:从头学Java17Stream-API一

Stream APIStream API 是依照map/filter/reduce办法解决内存中数据的最佳工具。本系列中的教程蕴含从基本概念始终到collector设计和并行流。 在流上增加中继操作将一个流map为另一个流map流是应用函数转换其元素。此转换可能会更改该流解决的元素的类型,但您也能够在不更改。 您能够应用 map()) 办法将一个流map为另一个流,该办法将此Function作为参数。map流意味着该流解决的所有元素都将应用该函数进行转换。 代码模式如下: List<String> strings = List.of("one", "two", "three", "four");Function<String, Integer> toLength = String::length;Stream<Integer> ints = strings.stream() .map(toLength);您能够此代码,并将其粘贴到 IDE 中以运行它。你不会看到任何货色,你可能想晓得为什么。 答案其实很简略:该流上没有定义末端操作。这段代码没有做任何事件。它不解决任何数据。 让咱们增加一个十分有用的末端操作collect(Collectors.toList()),它将解决后的元素放在一个列表中。如果您不确定此代码的真正作用,请不要放心;咱们将在本教程的前面局部介绍这一点。代码将变为以下内容。 List<String> strings = List.of("one", "two", "three", "four");List<Integer> lengths = strings.stream() .map(String::length) .collect(Collectors.toList());System.out.println("lengths = " + lengths);运行此代码将打印以下内容: lengths = [3, 3, 5, 4]您能够看到此模式创立了一个 Stream,由 map(String::length)) 返回。你也能够通过调用mapToInt)()而不是惯例的map())调用来使其成为一个专门的IntStream。这个mapToInt())办法将ToIntFuction作为参数。在上一示例中.map(String::length)更改为.mapToInt(String::length) 不会创立编译器谬误。String::length办法援用能够是两种类型:Function<String、Integer> 和 ToIntFunction<String>。 专用流没有 collect() 办法将Collector作参数。因而,如果用 mapToInt(),)则无奈再在列表中收集后果,至多不能应用此模式。让咱们获取无关该流的一些统计信息。这个 summaryStatistics()) 办法十分不便,并且仅在这些专门的原始类型流上可用。 List<String> strings = List.of("one", "two", "three", "four");IntSummaryStatistics stats = strings.stream() .mapToInt(String::length) .summaryStatistics();System.out.println("stats = " + stats);后果如下: ...

July 3, 2023 · 14 min · jiezi