java入门篇18 --- lambda与stream
lambda相信我们在各种程序都遇见过,就是一个匿名函数,stream从名字上看,这就是一个流,就跟python中yeild实现迭代器的原理一样,可以表示无限大的数据,但只占一点内存,在进行调用的时候可以实时计算出来,并返回。
那么接下来我们来看一下lambda用法,这个其实之前在集合以及多线程中已经使用过了,现在再来回顾一下
import java.util.Arrays; public class HelloWorld { public static void main(String[] args) throws Exception { String[] l = new String[]{"b", "a", "c", "p", "e"}; // 这个就是使用默认的排序 Arrays.sort(l); System.out.println(String.join(", ", l)); // a, b, c, e, p // 这个就是使用我们自定义的方法,这个就是匿名函数 ()->{},如果函数体只有一行,可以省略花括号以及return Arrays.sort(l, (String s1, String s2) -> { System.out.println("compare"); return -s1.compareTo(s2); }); Arrays.sort(l, (String s1, String s2) -> -s1.compareTo(s2)); System.out.println(String.join(", ", l)); // p, e, c, b, a // 方法引用,如果参数相同,返回值也一样,那么就可以简单的使用这种方法引用 Arrays.sort(l, HelloWorld::compare); System.out.println(String.join(", ", l)); // a, b, c, e, p } static int compare(String s1, String s2) { return s1.compareTo(s2); } }
接下来我们看一下stream,假如现在有一个需求,让你建立一个全体自然数的列表,如果我们直接使用列表去接受,那肯定不现实,下面我们来看一下Stream的使用
import java.nio.file.Files; import java.nio.file.Paths; import java.util.function.Supplier; import java.util.stream.Stream; class NatureNum implements Supplier<Integer> { int n = 0; @Override public Integer get() { n++; return n; } } public class HelloWorld { public static void main(String[] args) throws Exception { // 可以使用Stream.of创建对象 Stream<String> s = Stream.of("a", "b", "c"); s.forEach(System.out::println); // a b c // 可以使用Stream.generate(参数实现了supplier接口)生成数据流 Stream<Integer> l = Stream.generate(new NatureNum()); // filter过滤, map 执行一个方法的池子 limit 打印多少个 forEach循环 l.filter(n -> n % 2 == 0).map(n -> n * 2).limit(10).forEach(System.out::println); // 4 8 12 16 20 24 28 32 36 40 // 文件也可以使用liu使用Files.lines可以生成流 try (Stream<String> f = Files.lines(Paths.get("./src/t.txt"))) { f.forEach(System.out::println); // hello } } }