1、Stream流
Java 8 API添加了一个新的抽象称为流Stream,可以让你以一种声明的方式处理数据。
Stream 使用一种类似用 SQL 语句从数据库查询数据的直观方式来提供一种对 Java 集合运算和表达的高阶抽象。 Stream API可以极大提高Java程序员的生产力,让程序员写出高效率、干净、简洁的代码。 这种风格将要处理的元素集合看作一种流, 流在管道中传输, 并且可以在管道的节点上进行处理, 比如 筛选 (filter), 排序 (sorted), 映射 (map) 聚合 (collect)等。 元素流在管道中经过中间操作(intermediate operation)的处理,最后由最终操作(terminal operation)得到前面处理的结果。
如:
List<Integer> transactionsIds =
widgets.stream()
.filter(b -> b.getColor() == RED) // 过滤
.sorted((x,y) -> x.getWeight() - y.getWeight()) // 排序
.mapToInt(Widget::getWeight) // 映射(变换数据)
.sum(); // 聚合
官方给出的例子:
int sum = widgets.stream().filter(w -> w.getColor() == RED).mapToInt(w -> w.getWeight()).sum();
1356:
class Solution {
public int[] sortByBits(int[] arr) {
return Arrays.stream(arr).boxed().sorted((o1, o2)->{
int t = Integer.bitCount(o1.intValue()) - Integer.bitCount(o2.intValue());
if (t != 0)
return t;
else return o1 < o2 ? -1 : 1; // -1和1是可以变化的,只要保证后面大于前面就行!
}).mapToInt(i->i).toArray();
}
}
- boxed()是
IntStream
的一个APi,其作用为: 返回一个包含所有Integer元素的stream流 - bitCount()是
Integer
的APi表示 返回二进制表示的数中,所有1的个数 - Arrays.stream(int[] array): Returns a sequential
IntStream
with the specified array as its source. - Arrays.sort(T[] a, Comparator<? super T> c): Sorts the specified array of objects according to the order induced by the specified comparator.
Arrays.sort(nums, (o1, o2) -> {
int bitCountA = Integer.bitCount(o1);
int bitCountB = Integer.bitCount(o2);
// 相同按原数,不同按位数
return bitCountA == bitCountB ? o1 - o2 : bitCountA - bitCountB;
});
List<String> list = Arrays.stream(s.split("")).sorted().collect(Collectors.toList());
StringBuilder stringBuilder = new StringBuilder();
while(list.size() != 0) {
for(String value : list.stream().distinct().collect(Collectors.toList()) {
stringBuilder.append(value);
list.remove(value);
}
Collections.reverse(list);
}
return stringBuilder.toString();
哪些数据结构能够使用stream流操作
- list.stream()
- Arrays.stream(arr)