终端操作会从流的流水线生成结果。其结果可以是任何不是流的值,例如:List、Integer,甚至是 void 。
方法名 | 描述 |
allMatch(Predicate p) | 检查是否匹配所有元素 |
anyMatch(Predicate p) | 检查是否至少匹配一个元素 |
noneMatch(Predicate p) | 检查是否没有匹配所有元素 |
findFirst() | 返回第一个元素 |
findAny() | 返回当前流中的任意元素 |
count() | 返回流中元素总数 |
max(Comparator c) | 返回流中最大值 |
min(Comparator c) | 返回流中最小值 |
forEach(Consumer c) | 内部迭代(使用 Collection 接口需要用户去做迭代,称为外部迭代。相反,Stream API 使用内部迭代——它帮你把迭代做了) |
测试代码
TestFind.java
package java8.find;
import java.util.Arrays;
import java.util.Comparator;
import java.util.List;
import java.util.Optional;
import org.junit.Test;
/**
* @autho
* @version 创建时间:2017年12月28日 下午4:07:48
*/
public class TestFind {
/**
* 1.查找与匹配(终止操作,返回结果):
* allMatch(Predicate p) 检查是否匹配所有元素
* anyMatch(Predicate p) 检查是否至少匹配一个元素
* noneMatch(Predicate p) 检查是否没有匹配所有元素
* findFirst() 返回第一个元素
* findAny() 返回当前流中的任意元素
* count() 返回流中元素总数
* max(Comparator c) 返回流中最大值
* min(Comparator c) 返回流中最小值
* forEach(Consumer c) 内部迭代(使用 Collection 接口需要用户去做迭代,
* 称为外部迭代。相反,Stream API 使用内部迭代
* ——它帮你把迭代做了)
*/
List<Integer> listInteger = Arrays.asList(1,2,3,-10,-11,60,80,0,50);
// 1.allMatch(Predicate p):是不是所有的元素都匹配条件
@Test
public void test1() {
/**
* boolean allMatch(Predicate<? super T> predicate):
* 返回此流的所有元素是否与提供的谓词匹配。 如果不需要确定结果,则不
* 能评估所有元素上的谓词。 如果流为空,则true返回和谓语不评估。
* 这是一个short-circuiting terminal operation 。
* 参数
* predicate - a non-interfering,stateless 谓词适用于此流的元素
* 结果
* 如果流的所有元素匹配提供的谓词或流是空的返回true,否则 false
*/
// 是不是所有的元素都大于0
boolean allMatch = listInteger.stream().allMatch((e) -> e >0);
System.out.println(allMatch);
}
// 2.anyMatch(Predicate p):是否有一个元素匹配条件
@Test
public void test2() {
/**
* boolean anyMatch(Predicate<? super T> predicate):
* 返回此流的任何元素是否与提供的谓词匹配。 如果不需要确定结果,
* 则不能评估所有元素上的谓词。 如果流为空,则false返回和谓语不评估。
* 这是一个short-circuiting terminal operation 。
* 参数
* predicate -一个 non-interfering , stateless谓词适用于该流的元素
* 结果
* 如果流的任何元素匹配提供的谓词返回true,否则为 false
*/
// 是不是有一个元素大于79
boolean anyMatch = listInteger.stream().anyMatch((e) -> e > 79);
System.out.println(anyMatch);
}
// 3.noneMatch(Predicate p):是不是没有元素满足条件(p)
@Test
public void test3() {
/**
* boolean noneMatch(Predicate<? super T> predicate):
* 返回此流的元素是否与提供的谓词匹配。 如果不需要确定结果,
* 则不能评估所有元素上的谓词。 如果流为空,则true返回和谓语不评估。
* 这是一个short-circuiting terminal operation 。
* 参数
* predicate -一个 non-interfering , stateless谓词适用于该流的元素
* 结果
* 如果流中没有元素匹配提供的谓词或流是空的返回true,否则 false
*/
// 是不是没有元素小于2
boolean noneMatch = listInteger.stream().noneMatch((e) -> e < 2);
System.out.println(noneMatch);
}
// 4.findFirst():返回第一个元素
@Test
public void test4() {
/**
* Optional<T> findFirst():
* 返回描述此流的第一个元素的Optional如果流为空,则返回一个空的Optional 。
* 如果流没有遇到顺序,则可能会返回任何元素。
* 这是一个short-circuiting terminal operation 。
* 结果
* 一个 Optional此流的第一个元素的 Optional如果流为空, Optional
* 异常
* NullPointerException - 如果选择的元素为空
*/
// 返回流中的第一个元素
Optional<Integer> findFirst = listInteger.stream().findFirst();
System.out.println(findFirst.get());
}
// 5.findAny():返回任意一个
@Test
public void test5() {
/**
* Optional<T> findAny():
* 返回描述流的一些元素的Optional如果流为空,则返回一个空的Optional 。
* 这是一个short-circuiting terminal operation 。
* 这个操作的行为显然是不确定的; 可以自由选择流中的任何元素。
* 这是为了允许并行操作中的最大性能; 成本是同一来源上的多次调用可能
* 不会返回相同的结果。 (如果需要稳定的结果,请改用findFirst() )
* 结果
* 一个 Optional此流的某些元素的 Optional如果流为空, Optional
* 异常
* NullPointerException - 如果选择的元素为空
*/
// 从大于0的数中任意选取一个出来
Optional<Integer> findAny = listInteger.stream()
.filter((e) -> e > 0)
.findAny();
System.out.println(findAny.get());
}
// 6.count():返回流中的元素个数
@Test
public void test6() {
/**
* long count():
* 返回此流中的元素数。 这是一个reduction的特殊情况,相当于:
* return mapToLong(e -> 1L).sum(); 这是一个terminal operation 。
* 结果
* 这个流中元素的数量
*/
// 统计流中元素的个数
long count = listInteger.stream().count();
System.out.println("流中元素个数:" + count);
}
// 7.max(Comparator c):返回流中最大值,根据Comparator
@Test
public void test7() {
Comparator<Integer> com = (a,b) -> a - b;
/**
* Optional<T> max(Comparator<? super T> comparator):
* 根据提供的Comparator返回此流的最大元素。 这是一个reduction的特殊情况。
* 这是一个terminal operation 。
* 参数
* comparator -一个 non-interfering , stateless Comparator比较该流的元素
* 结果
* 一个 Optional此流的最大元素的 Optional如果流为空, Optional
* 异常
* NullPointerException - 如果最大元素为空
*/
// 返回流中最大的元素,按照Comparator
Optional<Integer> max = listInteger.stream().max(com);
System.out.println(max.get());
}
// 8.min(Comparator c):返回流中最小值,按Comparator
@Test
public void test8() {
Comparator<Integer> com = (a,b) -> a-b;
/**
* Optional<T> min(Comparator<? super T> comparator):
* 根据提供的Comparator返回此流的最小元素。 这是一个reduction的特例 。
* 这是一个terminal operation 。
* 参数
* comparator -一个 non-interfering , stateless Comparator比较该流的元素
* 结果
* 一个 Optional此流的最小元素的 Optional如果流为空, Optional
* 异常
* NullPointerException - 如果最小元素为空
*/
// 返回流中的最小值,按照Comparator
Optional<Integer> min = listInteger.stream().min(com);
System.out.println(min.get());
}
// 9.forEach(Consumer c):内部迭代
@Test
public void test9() {
/**
* void forEach(Consumer<? super T> action):
* 对此流的每个元素执行操作。
* 这是一个terminal operation 。
* 这个操作的行为显然是不确定的。 对于并行流管道,
* 此操作不保证遵守流的遇到顺序,因为这样做将牺牲并行性的好处。
* 对于任何给定的元素,动作可以在图书馆选择的任何时间和任何线索中执行。
* 如果操作访问共享状态,则负责提供所需的同步。
* 参数
* action - 一个 non-interfering对元素执行的动作
*/
// 内部迭代所有元素
listInteger.stream().forEach(System.out::println);
}
}