Ricadro


  • 首页

  • 标签

  • 分类

  • 归档

  • 关于

1.6 简单简化

发表于 2020-01-07 | 分类于 译文 | | 阅读次数:
字数统计: 558字 | 阅读时长 ≈ 2分钟

1.6 简单简化

现在你已经知道了如何创建并转换一个流,我们最终也是最重要的一点就是从流的数据中得到我们想要得到的。我们在本节中介绍的方法就是简化。简化是终端的操作,它将流减少为非流值直到可以在程序中被使用。

你早已见到流的简化:count()方法返回了流中元素的数量。

其他的简化有 max() 和 min() 方法,它们返回流中最大值或者是最小值。有一种说法-这些方法返回一个Optional 值,该值可以包装答案或表明没有答案(因为流恰巧是空的)。在过去,这种情况通常返回 null,但是当程序未完全测试的时候,这样会导致空指针异常。Optional类型是指示缺少返回值的更好方法。 我们将在下一节中详细讨论Optional类型。 这是获取最大流的方法:

1
2
Optional<String> largest = words.max(String::compareToIgnoreCase);
System.out.println("largest: " + largest.orElse(""));

findFirst() 返回非空集合中的第一个值。 与过滤器结合使用时通常很有用。 例如,在这里找到以字母Q开头的第一个单词(如果存在):

1
2
Optional<String> startsWithQ
= words.filter(s -> s.startsWith("Q")).findFirst();

阅读全文 »

1.5 其他流的转换

发表于 2019-12-30 | 分类于 译文 | | 阅读次数:
字数统计: 384字 | 阅读时长 ≈ 1分钟

1.5 其他流的转换

stream 的 distinct() 方法返回一个以去重后的从原始流中产生元素的流。流必须显示的记住已经被看到的。

1
2
3
Stream<String> uniqueWords
= Stream.of("merrily", "merrily", "merrily", "gently").distinct();
// 只有一个 "merrily" 被保留

为了对流进行排序,已排序方法有多种变体。一种适用于可比较元素流,另一种适用于比较器。在这里,我们对字符串进行排序,以使最长的字符串排在最前面:

1
2
Stream<String> longestFirst =
words.stream().sorted(Comparator.comparing(String::length).reversed());

与所有流转换一样,排序方法将产生一个新流,其元素是按排序顺序的原始流的元素。
当然,你可以通过流来对一个集合进行排序,当排序过程是流管道的一部分时,排序方法很有用。
最终,peek方法产生了另一个与原始元素具有相同元素的流,但是每次检索元素时都会调用一个函数。这对于调试很方便:

1
2
3
Object[] powers = Stream.iterate(1.0, p -> p * 2)
.peek(e -> System.out.println("Fetching " + e))
.limit(20).toArray();

当实际访问元素时,将打印一条消息。这样,您可以验证iterate返回的流是否被延迟处理。
为了进行调试,你可以通过 peek() 方法在你想要的地方设置断点。

阅读全文 »

1.4 提取子流并合并流

发表于 2019-12-30 | 分类于 译文 | | 阅读次数:
字数统计: 276字 | 阅读时长 ≈ 1分钟

1.4 提取子流并合并流

调用stream.limit(n)返回一个新的流,该流在n个元素之后(或当如果较短,则原始流结束)。此方法适用于切割一个特定大小的流。例如,

1
Stream<Double> randoms = Stream.generate(Math::random).limit(100);

将会生成一个包含100个随机数的流

调用stream.skip(n)恰好相反。它丢弃前 n 个元素。在我们的示例中,这很方便,由于 split() 方法,当第一个元素是不需要的空字符串时,我们可以通过调用 skip() 来消除它:

1
Stream<String> words = Stream.of(contents.split("[\\P{L}]+")).skip(1);

你可以使用Stream类的静态方法 concat() 来连接两个流:

1
2
3
Stream<String> combined = Stream.concat(
letters("Hello"), letters("World"));
// Yields the stream ["H", "e", "l", "l", "o", "W", "o", "r", "l", "d"]

当然,第一个流不应是无限的,否则第二个流将永远没有机会拼接起来。

阅读全文 »

1.3 filter(), map(), 和 flatMap() 方法

发表于 2019-12-05 | 分类于 译文 | | 阅读次数:
字数统计: 707字 | 阅读时长 ≈ 3分钟

1.3 filter(), map(), 和 flatMap() 方法

流的转换将产生一个新流,其元素来自于另一个流的元素。 你已经看到了过滤器转换流,该转换将产生具有符合特定条件的那些元素的新流。 在这里,我们将字符串流转换为仅包含长单词的另一个流:

1
2
List<String> words = ...;
Stream<String> longWords = words.stream().filter(w -> w.length() > 12);

filter 的参数为泛型,即从 T 到 boolean 的函数。

通常,你想通过某种方式来转化流中的值,使用 map() 方法并对流进行转化。例如,你可以通过以下的例子来将所有的单词转化为小写。

1
Stream<String> lowercaseWords = words.stream().map(String::toLowerCase);

在这里,我们引用了 map() 方法。通常情况下,你可以使用 lambda 表达式来替代它。

1
Stream<String> firstLetters = words.stream().map(s -> s.substring(0, 1));

结果中将包含每一个单词的首字母。

阅读全文 »

1.2 创建流

发表于 2019-11-29 | 分类于 译文 | | 阅读次数:
字数统计: 1k字 | 阅读时长 ≈ 5分钟

1.2 创建流

你已经知道可以通过实现了 Collection 接口的 stream 方法来将集合转化为 stream。当你想要将数组转化为stream 时,那么应该使用静态方法 Stream.of 。

1
2
Stream<String> words = Stream.of(contents.split("[\\P{L}]+"));
// split returns a String[] array

这个方法有 varargs 参数,所以你可以根据参数的不同来创建不同的流。

1
2
3
4
5
Stream<String> song = Stream.of("gently", "down", "the", "stream");
// 使用 Arrays.stream(array, from, to) 方法来从数组的一部分生成流
//使用 Stream.empty 来构建一个没有元素的流
Stream<String> silence = Stream.empty();
// Generic type <String> is inferred; same as Stream.<String>empty()

Stream 接口通过两个静态方法来创建无穷的流,generate() 方法采用没有参数的函数(从技术角度上来说,是Supplier 接口产生的对象)。当流的值需要时,调用此函数来生成值,你可以用以下的方式来创建拥有常量元素的流。

1
2
Stream<String> echos = Stream.generate(() -> "Echo");
Stream<Double> randoms = Stream.generate(Math::random);
阅读全文 »

1.1 从迭代到流操作

发表于 2019-11-28 | 分类于 译文 | | 阅读次数:
字数统计: 1k字 | 阅读时长 ≈ 4分钟

最近在阅读 Java 核心技术卷2高级特性时,由于是英文文档,就试着翻译了一下,其中部分单词还是需要借助 Google 翻译,希望在之后的阅读翻译过程中,会有很大的进步。

1.1 从迭代到流操作

当处理一个集合时,你通常通过迭代遍历集合的每一个元素并对其进行操作。例如,我们想统计一本书中的长单词,首先,我们要把它们放进 list 中

1
2
3
4
String contents = new String(Files.readAllBytes(
Paths.get("alice.txt")), StandardCharsets.UTF_8); // Read file into string
List<String> words = Arrays.asList(contents.split("[\\P{L}]+"));
// Split into words; nonletters are delimiters

然后我们开始迭代

1
2
3
4
5
int count = 0;
for (String w : words)
{
if (w.length() > 12) count++;
}
阅读全文 »

Mac创建多个SSH密钥以使用不同的账号

发表于 2019-11-05 | 分类于 日常问题 | | 阅读次数:
字数统计: 322字 | 阅读时长 ≈ 1分钟

问题描述

由于工作需要,版本控制需要使用到Gitlab,之前已经有了GitHub的SSH密钥,所以需要生成新的Gitlab密钥,来保证连接成功,无需每次访问时提供用户名和密码。

阅读全文 »

解决 Oracle 误删表空间文件所引起的数据库无法连接问题

发表于 2019-05-20 | 分类于 日常问题 | | 阅读次数:
字数统计: 195字 | 阅读时长 ≈ 1分钟

问题描述

由于误删 Oracle 的表空间数据文件 **.dbf,导致数据库服务无法连接。

阅读全文 »

shell输出svn日志到指定文件

发表于 2019-05-06 | 分类于 日常问题 | | 阅读次数:
字数统计: 375字 | 阅读时长 ≈ 1分钟

问题描述

由于项目很老,没有使用 Maven 构建,每次项目上线发布增量包的时候是使用 Ant Build 的,这里就需要一个文件清单,之前用 Windows 的时候,使用小乌龟可以很快捷的拷贝出所需的清单,换用 Mac 之后暂时还没找到好用的 svn 版本控制软件,只能从 IDE 中查找 svn 提交历史或是从终端查找,及其不方便,所以花了点时间从菜鸟教程上学了点 shell 脚本命令,基本实现了自己所需要的功能,下面是脚本。

阅读全文 »

从上往下打印二叉树

发表于 2019-04-19 | 分类于 剑指offer | | 阅读次数:
字数统计: 167字 | 阅读时长 ≈ 1分钟

题目描述

从上往下打印出二叉树的每个节点,同层节点从左至右打印。

解题思路

  • 使用队列来存储每层的节点,然后依次放入 List 中即可。
阅读全文 »
12…4

ricadro

40 日志
7 分类
11 标签
GitHub E-Mail
© 2020 ricadro | Site words total count: 15.1k
由 Hexo 强力驱动
|
主题 — NexT.Muse v5.1.4