大家好。值此比赛之际,我决定在这里写的不是一篇文章,而是一个简短的课程。它将涉及 Java 中的 lambda 表达式和流。如果您已经熟悉并使用它们,请直接跳到本文末尾,您可以练习 JavaRush 的一小部分任务。你需要java 8以上,接受JR的培训,会有很少的细节和很多看不懂的东西,想搞清楚的欲望很强烈。首先,我不会解释 lambda 和流的出现历史,我只是自己也不知道。我只知道它们是从函数式编程风格,到我们的OOP风格。在我短暂的学习经历中,我简单地展示了如何和什么,有些人觉得很难理解这个想法,所以只要记住如何写,稍后你就会明白。
现在让我们继续讨论 Java 流。作为读者,您可能没有想到过这些流。不,不是
拉姆达斯
如果您根本不知道什么是 lambda,那么: lambda 看起来像这样:(a, b) -> a.compareTo(b)
(переменные) -> действие
现在就够了。您可以在这里阅读理论:链接一,链接二,但我认为实践更有趣。我建议你解决以下问题:使用方法1编写一个计算器。该方法应该接受2个数字值和其他东西。您的代码将如下所示:
class Lambda{
public static void main (String[] args) {
}
public static double calculate(){
return null;
}
}
您需要在方法签名中输入3个参数calculate
,在中添加1个命令return
并在中测试调用该方法main
。 这个方法应该能够做什么?
- 折叠;
- 乘;
- 划分;
- 减去;
- 计算根;
- 提升到一个幂;
- 将参数总和除以第一个数字 + 117 求幂;
- 以及您能想到的所有其他操作。
if-else
;char
作为运行指标;switch-case
;- 以及您想到的所有其他内容。
- 只有 lambda,任务就在他们身上。
inputStream
,也不是OutputStream
。这是不同的,它更有趣。流已经取代了循环,虽然不是完全,但仍然如此。他们的座右铭是“不要解释如何做,而是解释要做什么”。流的一个小例子:
List<String> myList = Arrays.asList("a1", "a2", "b1", "c2", "c1");
myList.stream()
.filter(s -> s.startsWith("c"))
.map(String::toUpperCase)
.sorted()
.forEach(System.out::println);
这里发生了什么?我们来添加评论:
myList.stream() // получить поток
.filter(s -> s.startsWith("c")) //отфильтровать значения, оставить те, что начинаются с «с»
.map(String::toUpperCase) // преобразовать все значения, перевести в верхний регистр
.sorted() // отсортировать по порядку (дефолтный порядо)
.forEach(System.out::println); // вывести каждый элемент на экран
与常规循环比较:
List<String> toSort = new ArrayList<>();
for(String s : myList){
if(s.startsWith("c")){
toSort.add(s.toUpperCase());
}
}
Collections.sort(toSort);
for(String s : toSort){
System.ouy.println(s);
}
当你阅读代码时,一切看起来都很可怕,但是有了注释是不是更容易?这很正常,我也很久没听懂。理解的关键是实践。因此,我们开始阅读第三方文章,寻找我们问题的答案,你也可以在评论中提问,我不会给出完整的答案,但我会指出方向。 我认为对于练习流式处理非常有用的 JavaRush 任务列表:
-
2208 - 可以用 1 个流和 1 个返回来解决,即 该方法的主体将从 开始
return
,然后将有 1 个完整的流。让我们忽略这个要求StringBuilder
。 -
1908 - 你也可以用 1 个流和 1 个返回来解决它。从读取文件开始。我不知道如何通过流录制到文件(如果可能的话),现在我们手动进行。那些。我们只打开 2 个流(控制台和写入文件)。我们通过方法读取文件,这些方法将返回一个工作表或一个流(google 和 javadoc)。
-
1907——理论上也可以一流解决。流的输入是文件名,输出是世界的字数。
-
1016 - 用稍微变态的方式,可以1流1回解决;
-
1821 - 非常简单,1 次流,1 次返回。
这两个任务将向您介绍另一种流方法和另一种收集器。
-
1925 - 你可以在一个流中获取一行包含单词的内容,然后将其写入文件(我不知道是否可以从流写入文件)
GO TO FULL VERSION