计算(排序、查找、过滤、映射、遍历等),面向CPU。集合关注的是数据的存储,面向内存。一个数据源(如:集合、数组),获取一个流
多个中间操作可以连接起来形成一个流水线,除非流水线上触发终止操作,否则中间操作不会执行任何的处理!而在终止操作时一次性全部处理,称为“惰性求值”
终端操作会从流的流水线生成结果
@Test
public void test(){
List<Integer> list = Arrays.asList(1,2,3,4,5);
//JDK1.8中,Collection系列集合增加了方法
Stream<Integer> stream = list.stream();
}
Java8 中的 Collection 接口被扩展,提供了两个获取流的方法
1.default Streamstream() : 返回一个顺序流 2.default Stream parallelStream() : 返回一个并行流
@Test
public void test(){
String[] arr = {"hello","world"};
Stream<String> stream = Arrays.stream(arr);
int[] arr = {1,2,3,4,5};
IntStream stream = Arrays.stream(arr);
}
@Test
public void test04(){
Stream<Integer> stream = Stream.of(1,2,3,4,5);
}
从流中排除某些元素
public static void main(String[] args) {
List<Person> list = new ArrayList<>();
Person p1 = new Person(1,"xixi");
Person p2 = new Person(3,"haha");
list.add(p1);
list.add(p2);
list.stream().filter(person -> person.getAge() > 2).forEach(System.out :: println);
}
使元素不超过指定数量
public static void main(String[] args) {
List<Person> list = new ArrayList<>();
Person p1 = new Person(1,"xixi");
Person p2 = new Person(3,"haha");
list.add(p1);
list.add(p2);
list.stream().limit(1).forEach(System.out :: println);
}

跳过前面n个元素
public static void main(String[] args) {
List<Person> list = new ArrayList<>();
Person p1 = new Person(1,"xixi");
Person p2 = new Person(3,"haha");
Person p3 = new Person(5,"yiyi");
list.add(p1);
list.add(p2);
list.add(p3);
list.stream().skip(2).forEach(System.out :: println);
}

通过流中元素的hashCode()和equals()方法,去除重复元素
映射,将元素转换为其他形式或提取信息
public static void main(String[] args) {
List<String> list = Arrays.asList("aa", "bb", "cc");
/* 1.lmabda表达式 */
list.stream().map(item -> item.toUpperCase()).forEach(System.out :: println);
/* 2.方法引用 */
list.stream().map(String :: toUpperCase).forEach(System.out :: println);
}

排序,自然排序或定制化排序
public static void main(String[] args) {
// 自然排序
Integer[] arr = new Integer[]{345,3,64,3,46};
Arrays.stream(arr).sorted().forEach(System.out::println);
}

public static void main(String[] args) {
// 定制化排序
Person p1 = new Person(12, "xixi");
Person p2 = new Person(2, "haha");
List<Person> list = new ArrayList<>();
list.add(p1);
list.add(p2);
list.stream().sorted((e1, e2) -> p1.getAge() - p2.getAge()).forEach(System.out::println);
}

检查是否匹配所有元素
public static void main(String[] args) {
Person p1 = new Person(12, "xixi");
Person p2 = new Person(2, "haha");
List<Person> list = new ArrayList<>();
list.add(p1);
list.add(p2);
System.out.println(list.stream().allMatch(person -> person.getAge() > 10));
}

检查是否至少匹配一个元素
public static void main(String[] args) {
Person p1 = new Person(12, "xixi");
Person p2 = new Person(2, "haha");
List<Person> list = new ArrayList<>();
list.add(p1);
list.add(p2);
System.out.println(list.stream().anyMatch(person -> person.getAge() > 10));
}

返回第一个元素
public static void main(String[] args) {
Person p1 = new Person(12, "xixi");
Person p2 = new Person(2, "haha");
List<Person> list = new ArrayList<>();
list.add(p1);
list.add(p2);
System.out.println(list.stream().findFirst().get());
}

返回流中的总个数
public static void main(String[] args) {
Person p1 = new Person(12, "xixi");
Person p2 = new Person(2, "haha");
List<Person> list = new ArrayList<>();
list.add(p1);
list.add(p2);
System.out.println(list.stream().count());
}

返回流中的最大值和最小值
public static void main(String[] args) {
Person p1 = new Person(12, "xixi");
Person p2 = new Person(2, "haha");
List<Person> list = new ArrayList<>();
list.add(p1);
list.add(p2);
System.out.println(list.stream().map(Person::getAge).max(Integer::compare).get());
System.out.println(list.stream().map(Person::getAge).min(Integer::compare).get());
}

内部迭代
public static void main(String[] args) {
Person p1 = new Person(12, "xixi");
Person p2 = new Person(2, "haha");
List<Person> list = new ArrayList<>();
list.add(p1);
list.add(p2);
// 针对于集合,JDK8中增加了一个遍历的方法
list.forEach(System.out::println);
}

将流中元素反复结合起来,得到一个值
public static void main(String[] args) {
List<Integer> list = Arrays.asList(1, 2, 3, 4, 5, 6, 7, 8, 9, 10);
// 1.无初始值
System.out.println(list.stream().reduce((x1, x2) -> x1 + x2).get());
System.out.println(list.stream().reduce((x1, x2) -> Integer.sum(x1, x2)).get());
System.out.println(list.stream().reduce(Integer::sum).get());
// 2.有初始值
System.out.println(list.stream().reduce(10, (x1, x2) -> x1 + x2));
System.out.println(list.stream().reduce(10, (x1, x2) -> Integer.sum(x1, x2)));
System.out.println(list.stream().reduce(10, Integer::sum));
}

将流转换为其他形式
public static void main(String[] args) {
Person p1 = new Person(12, "xixi");
Person p2 = new Person(1, "haha");
List<Person> list = new ArrayList<>();
list.add(p1);
list.add(p2);
// collectors里有很多方法,可以转为不同的形式
List<Person> resList = list.stream().filter(p -> p.getAge() > 10).collect(Collectors.toList());
resList.forEach(System.out::println);
}

延迟执行的。这意味着会等到需要结果的时候才执行。即一旦执行终止操作,就执行中间操作链,并产生结果