Написанное промежуточный программный код, связанные, при условии SDK использовать деловую сторону, но много деловой стороны застряли в версии 1.7, отложить обновление для совместимости, а не использовать некоторые из новых функций Java8 в коде, например, поток и тому подобное, хотя он не может использовать, но все равно придется узнать.
Что такое поток
Поток новая функция добавлена в Java 8, java.io пакет InputStream и OutputStream совершенно разные понятия. Это с помощью лямбда-выражений, позволяет обрабатывать данные в декларативно, это может значительно повысить производительность Java-программистов, что позволяет программистам писать эффективный, чистый, простой код.
поток Demo
Непосредственно на демо, чувствовать
Список <String> MyList = Arrays.asList ( "A", "B", "C", "D", "E"); myList.stream () .filter (S -> s.startsWith ( "1") ) .map (String :: toUpperCase) .sorted () .forEach (System.out :: Println);
Как работать поток
Когда поток времени, как правило, включает в себя три основных этапа:
Получение источника данных (источник)
преобразование данных
Выполнение операций для получения желаемых результатов
Поток за конверсию исходный объект не изменяется, новый объект возвращает поток (может быть несколько переходов), что позволяет таким же, как цепи могут быть расположены в их работе, в трубу, как показано на фиг.
В потоке, операция делится на две
Промежуточная операция
конец
Операция потока возвращается на промежуточный, терминал или непустой возврат результата операции Stream, в демонстрационном примере, filter
, map
, sorted
считается промежуточной операцией, и forEach
это конец операция.
Как создать поток
创建Stream的方式很多,最常见的是从Collections,List 和 Set中生成
List<String> myList = Arrays.asList("a1", "a2", "b1", "c2", "c1");Stream<String> stream = myList.stream()
在对象myList上调用方法 stream() 返回一个常规对象Stream。
也可以从一堆已知对象中生成。
Stream<String> stream = Stream.of("a1", "a2", "a3")
当然了,还有其它方式:
Collection.stream()
Collection.parallelStream()
BufferedReader.lines()
Files.walk()
BitSet.stream()
Random.ints()
JarFile.stream()
....
常规操作
forEach
forEach
方法接收一个 Lambda 表达式,用来迭代流中的每个数据
Stream.of(1, 2, 3).forEach(System.out::println);// 1// 2// 3
map
map
用于映射每个元素到对应的结果
Stream.of(1, 2, 3).map( i -> i*i).forEach(System.out::println);// 1// 4// 9
filter
filter
用于通过设置的条件过滤出元素
Stream.of(1, 2, 3).filter( i -> i == 1).forEach(System.out::println);// 1
limit
limit
用于用于获取指定数量的流
Stream.of(1, 2, 3, 4, 5).limit(2).forEach(System.out::println);// 1// 2
sorted
sorted
用于对流进行排序
Stream.of(4, 1, 5).sorted().forEach(System.out::println);// 1// 4// 5
Match
有三个 match 方法,从语义上说:
allMatch:Stream 中全部元素符合传入的 predicate,返回 true
anyMatch:Stream 中只要有一个元素符合传入的 predicate,返回 true
noneMatch:Stream 中没有一个元素符合传入的 predicate,返回 true
它们都不是要遍历全部元素才能返回结果。例如 allMatch 只要一个元素不满足条件,就 skip 剩下的所有元素,返回 false。
boolean result = Stream.of("a1", "a2", "a3").allMatch(i -> i.startsWith("a"));System.out.println(result);// true
reduce
reduce
方法根据指定的函数将元素序列累积到某个值。此方法有两个参数:
起始值
累加器函数。
如果有一个List,希望得到所有这些元素和一些初始值的总和。
int result = Stream.of(1, 2, 3).reduce(20, (a,b) -> a + b);System.out.println(result);// 26
collect
Collectors类中提供了功能丰富的工具方法
toList
toSet
toCollection
toMap
...
而这些方法,都需要通过 collect
方法传入。
Set<Integer> result = Stream.of(1, 1, 2, 3).collect(Collectors.toSet());System.out.println(result);// [1, 2, 3]
collect
可以把Stream数据流转化为Collection对象,
骚技巧
for循环
除了常规的对象Stream,还有一些有特殊类型的Stream,用于处理基本数据类型int、long和double,它是IntStream、LongStream和DoubleStream。
比如可以使用IntStream.range()来代替常规的for循环。
IntStream.range(1, 4).forEach(System.out::println);
随机数
Random的ints方法可以返回一个随机数据流,比如返回1到100的10个随机数。
Random random = new Random();random.ints(1, 100).limit(10).forEach(System.out::println);
大小写转化
List<String> output = wordList.stream() .map(String::toUpperCase) .collect(Collectors.toList());
Stream 特点
总之,Stream 的特性可以归纳为:
无存储
Stream并不是一种数据结构,它只是某种数据源的一个视图
安全性
对Stream的任何修改都不会修改背后的数据源,比如对stream执行过滤操作并不会删除被过滤的元素,而是会产生一个不包含被过滤元素的新Stream。
惰式执行
Stream上的操作并不会立即执行,只有等到用户真正需要结果的时候才会执行。
一次性
Stream只能被“消费”一次,一旦遍历过就会失效,就像容器的迭代器那样,想要再次遍历必须重新生成。
lambda
所有 Stream 的操作必须以 lambda 表达式为参数