JavaRush /Java 博客 /Random-ZH /Lambda 和 Stream,只有实践,没有理论

Lambda 和 Stream,只有实践,没有理论

已在 Random-ZH 群组中发布
大家好。值此比赛之际,我决定在这里写的不是一篇文章,而是一个简短的课程。它将涉及 Java 中的 lambda 表达式和流。如果您已经熟悉并使用它们,请直接跳到本文末尾,您可以练习 JavaRush 的一小部分任务。你需要java 8以上,接受JR的培训,会有很少的细节和很多看不懂的东西,想搞清楚的欲望很强烈。首先,我不会解释 lambda 和流的出现历史,我只是自己也不知道。我只知道它们是从函数式编程风格,到我们的OOP风格。在我短暂的学习经历中,我简单地展示了如何和什么,有些人觉得很难理解这个想法,所以只要记住如何写,稍后你就会明白。

拉姆达斯

Lambda 和流,只有实践,没有理论 - 1Lambda 和流,只有实践,没有理论 - 2如果您根本不知道什么是 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,任务就在他们身上。
- 什么?这就是全部了吗?- 是的,就是这样,因为你实际上需要添加 3 行,如果我建议至少一行,其余的将自动写入。如果您愿意,您可以通过谷歌搜索示例并尝试理解。当然,你会检查自己,如果你作弊,没有人会知道,但那为什么呢?解决了这样一个简单的问题后,我所有 1.5 年级的学生都粗略地了解了 lambda 是什么以及如何使用它们。这对于流媒体来说是非常必要的。如果您想炫耀结果并了解您是否做对了,请通过私人消息发送代码。无需评论;您可以在那里添加有趣的提示(但不要使任务变得太容易)。同样,解决了这个示例后,您应该已经对如何使用 lambda 有了大致的了解。
Lambda 和流,只有实践,没有理论 - 3
现在让我们继续讨论 Java 流。作为读者,您可能没有想到过这些流。不,不是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——理论上也可以一流解决。流的输入是文件名,输出是世界的字数。

就这样。如果可以的话,我会再写一个简单的故事。在我看来,阅读一些很酷的东西而没有机会尝试它在某种程度上是无聊的。在计算器和 3 个谜题之后,我认为您已经熟悉了 lambda 和流,所以如果您还没有了解所有的可能性,请阅读一下。更新:
  • 1016 - 用稍微变态的方式,可以1流1回解决;

  • 1821 - 非常简单,1 次流,1 次返回。

    这两个任务将向您介绍另一种流方法和另一种收集器。

  • 1925 - 你可以在一个流中获取一行包含单词的内容,然后将其写入文件(我不知道是否可以从流写入文件)

评论
TO VIEW ALL COMMENTS OR TO MAKE A COMMENT,
GO TO FULL VERSION