Stream流(jdk新特性)

Stream流

  • java8,通过Lambda表达式引入
获取流对象

java.util.stream.Stream是Java 8新加入的最常用的流接口。(这并不是一个函数式接口。)

获取一个流非常简单,有以下几种常用的方式:
- 所有的Collection集合都可以通过stream默认方法获取流;
- java.util.Map接口不是Collection的子接口,且其K-V数据结构不符合流元素的单一特征,所以获取对应的流需要分key、value或entry等情况:
- Stream接口的静态方法of可以获取数组对应的流。

### ==通过Collection集合获取流对象==
- 首先,java.util.Collection接口中加入了default方法stream用来获取流,所以其所有实现类均可获取流。



public class Collection2Stream(){
    //collection集合
    Collection c = new Collection();
    Stream stream1 = c.stream();

    //List集合
    List<String> list = new ArrayList<>();
    Stream<String> stream2 = list.stream();

    //Set集合
    Set<String> set = new HashSet<>();
    Stream<String> stream3 = set.stream();

    //Map集合
    HashMap<String,String> map = new HashMap<>();
    //1.keyset集合
    Stream<String> stream1 = map.keySet().stream();
    //2. values
    Stream<Integer> stream2 = map.values().stream();
    // 3. entrySet
    Stream<Map.Entry<String, Integer>> stream3 = map.entrySet().stream();

}

根据Map获取流



public class Map2Stream(){

    //Map集合
    HashMap<String,String> map = new HashMap<>();
    //1.keyset集合
    Stream<String> stream1 = map.keySet().stream();
    //2. values
    Stream<Integer> stream2 = map.values().stream();
    // 3. entrySet
    Stream<Map.Entry<String, Integer>> stream3 = map.entrySet().stream();

}

根据数组获取流

  • 如果使用的不是集合或映射而是数组,由于数组对象不可能添加默认方法,所以Stream接口中提供了静态方法of,使用很简单:
public class Array2Stream(){


    String[] array = { "张无忌", "张翠山", "张三丰", "张一元" };

    // Stream 类的静态方法 : of
    Stream<String> stream = Stream.of(array);
    System.out.println("stream = " + stream);

}

Stream流的常用API
  • 在上述介绍的各种方法中,凡是返回值仍然为Stream接口的为函数拼接方法,它们支持链式调用;而返回值不再为Stream接口的为终结方法,不再支持链式调用。如下表所示:
方法名方法作用方法种类是否支持链式调用
count统计个数终结
forEach逐一处理终结
filter过滤函数拼接
limit取前几个函数拼接
skip跳过前几个函数拼接
map映射函数拼接
contact组合函数拼接

流API的使用

逐一处理:forEach
  • void forEach(Consumer
统计个数:count
  • 返回值为long类型

void forEach(Consumer<? super T> action);
该方法接收一个Consumer接口函数,会将每一个流元素交给该函数进行处理。例如:

import java.util.stream.Stream;

public class Test1 {
    public static void main(String[] args) {

        Stream<String> stream = Stream.of("张无忌", "张学友", "刘德华", "张三丰");

        // void forEach(Consumer<? super T> action);
        stream.forEach(System.out::println);
        //返回值为long
        long count = stream.count();
    }
}

过滤:filter
  • Stream filter(Predicate
取前几个:limit
  • Stream limit(long maxSize);
跳过前几个:skip
  • Stream skip(long n);
public class Test1 {
    public static void main(String[] args) {

        Stream<String> stream = Stream.of("张无忌", "张学友", "刘德华", "张三丰");

        stream.filter(name->name.startsWith("张"))
              .limit(2)
              .forEach(System.out::println);

    }
}

映射:map
- `<R> Stream<R> map(Function<? super T, ? extends R> mapper);`
- 该接口需要一个Function函数式接口参数,可以将当前流中的 T 类型数据转换为另一种 R 类型的流。
import java.util.stream.Stream;

public class Test1 {
    public static void main(String[] args) {

        Stream<String> stream = Stream.of("10", "20", "30", "40", "50");

        // <R> Stream<R> map(Function<? super T, ? extends R> mapper);
        // Function 接口 : R apply(T t);
        stream.map(Integer::parseInt).forEach(System.out::println);
    }
}

组合:concat
  • 如果有两个流,希望合并成为一个流,那么可以使用Stream接口的静态方法concat:
    • static Stream concat(Stream
import java.util.stream.Stream;

public class Test2 {
    public static void main(String[] args) {

        Stream<String> stream1 = Stream.of("刘德华", "张学友", "黎明", "郭富城");
        Stream<String> stream2 = Stream.of("西施", "杨玉环", "貂蝉", "王昭君");

        Stream<String> stream = Stream.concat(stream1, stream2);
        stream.forEach(System.out::println);
    }
}
  • 2
    点赞
  • 4
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值