Stream流式计算
1.Stream流
Stream流式计算的相关方法都位于java.util.stream包下,一般我们使用集合进行数据的存储,使用流进行计算,而如何将集合转换成数组呢?只需要使用集合.stream()方法将集合中的数据转换成流对象。
2.流式计算常用方法
2.1 stream()将集合中的数据全部转换为流对象;
default Stream<E> stream() {
return StreamSupport.stream(spliterator(), false);
}
2.2 Stream<T> filter(Predicate<? super T> predicate)方法
用于过滤数据,我们从参数列表可以看出,参数是断定型函数式接口可以使用lambda表达式进行优化,因为Predicate断定式函数型接口只有入参,返回值是一个布尔值,所以可以简化为集合.filter(参数->{return 一般加相关业务的判断来进行筛选,返回值需要是布尔类型}),举个栗子:筛选出集合中id为1的数据,即:list.stream().filter(u->u.getId()==1);(优化前是list.stream().filter((u)->{return u.getId()==1;});)
Stream<T> filter(Predicate<? super T> predicate);
2.3 void forEach(Consumer<? super T> action)方法
用于遍历集合,我们从参数列表可以看出,参数是断定型函数接口可以使用lambda表达式进行优化,因为Consumer消费者型函数式接口只有入参,并且没有返回值,所以可以简化为集合.forEach(参数->{相关业务代码}),举个栗子:遍历出集合中的所有元素的名字list.stream().forEach(u->{ u.getName();});或者单独一个对象打印方法list.stream().forEach(System.out::println);
void forEach(Consumer<? super T> action);
2.4 <R> Stream<R> map(Function<? super T, ? extends R> mapper)方法
因为map方法主要是用于映射,所以需要传入一个映射的值,再瞅瞅map方法的参数,我们发现是一个Function函数式接口,有一个入参和一个返回值,所以可以简化为集合.map(参数->{return 相关业务代码}),举个例子:打印出集合中所有对象的年龄list.stream().map(u->u.getAge()).forEach(System.out::println);
<R> Stream<R> map(Function<? super T, ? extends R> mapper);
2.5 Stream<T> sorted(Comparator<? super T> comparator)方法
用于排序,其中Comparator也是一个用于排序的函数式接口,需要配合map方法进行使用,只用到了一个排序方法所以可以使用lambda表达式进行优化,格式为集合.sorted((u1,u2)->{return u1.compareTo(u2);})或者使用无参的方法,集合.sorted()进行正序排列,集合.sorted((u1,u2)->{return u2.compareTo(u1);})进行倒序排列,举个例子:打印出集合中的所有年龄并且按照倒序排序,即list.stream().map(u -> u.getAge()).sorted((u1,u2)->{return u2.compareTo(u1);}).forEach(System.out::println);下图为Compartor排序的函数式接口:
public interface Comparator<T> {
int compare(T o1, T o2);
下面是sorted排序方法的一种是无参的正序排列方法,一种是有参可以自定义排序的排序方法;
Stream<T> sorted();
Stream<T> sorted(Comparator<? super T> comparator);
2.6 Stream<T> limit(long maxSize)方法
是用于截取最大个数的方法,只有一个入参(最大个数),对集合按照自定义的个数进行截取,格式为:集合.limit(最大个数),举个例子:打印出集合中两个数据的年龄,即:list.stream().map(u -> u.getAge()).limit(2).forEach(System.out::println);
Stream<T> limit(long maxSize);
3.综合使用上述常用流式计算的小案例(使用链式编程)
案例:创建6个用户满足:1.筛选出id为偶数;2.年龄大于23;3.获取用户名称并转换为大写;4.进行倒序排列;5.打印出年龄最大的用户。
根据下面的代码我们可以总结出stream流式计算(链式编程)的优点会使执行的效率提高,代码变得简捷,看起来更加优雅等。
User user1 = new User(1, "name1", 21);
User user2 = new User(2, "name2", 22);
User user3 = new User(3, "name3", 23);
User user4 = new User(4, "name4", 24);
User user5 = new User(5, "name5", 25);
User user6 = new User(6, "name6", 26);
List<User> list = Arrays.asList(user1,user2,user3,user4,user5,user6);
list.stream()
.filter(u -> u.getId()%2 == 0)
.filter(u -> u.getAge() >= 23)
.map(u -> u.getName().toUpperCase())
.sorted((u1,u2) -> {return u2.compareTo(u2);})
.limit(1)
.forEach(System.out::println);
- 点赞
- 收藏
- 关注作者
评论(0)