Java8 中Stream的常用技巧

Java8中,Stream数据流操作对集合操作做了极大的简化,学习了Stream,以后我们可以不用for循环就能对集合进行很多操作。

Stream的初始化

Java中所有的Stream操作,都是针对流对象的,故使用Stream必须得初始化得到Stream类型对象:

  • Stream初始化:

    Stream stream = Stream.of("a","b","c");
    
  • 数组转换为Stream:

    String [] strArray = new String[]{
          
          "a","b","c"};
    Stream stream = Stream.of(strArray);
    //或者
    Stream stream = Arrays.stream(strArray);
    
  • 集合对象转换为Stream:

    List<String> list = Arrays.asList(strArray);
    stream = list.stream();
    

流操作

1、遍历操作(map)

使用map操作可以遍历集合中的每个对象,并对其操作;

map操作后,使用.collect(Collectors.toList())可以得到操作后的集合。

eg:

//1.1 遍历并转换为大写
List<String> output = wordList.stream()
    .map(String::toUpperCase)
    .collect(Collectors.toList());

//1.2 对每个元素进行平方计算
List<Integer> nums = Arrays.asList(1,2,3,4);
List<Integer> squareNums = nums.stream()
    .map(n->n*n)
    .collect(Collectors.toList());

2、过滤操作(filter)

利用filter可以对Stream中的数据元素进行过滤,通过过滤的元素会保留下来生成一个新的Stream。

List<String> filterLists = new ArrayList<>();
filterLists.add("");
filterLists.add("a");
filterLists.add("b");
List afterFilterLists = filterLists.stream()
    .filter(s->!s.isEmpty())
    .collect(Collectors.toList());

3、循环操作(forEach)

对Stream中的每个对象进行自定义操作,可使用forEach:

List<String> forEachLists = new ArrayList<>();

forEachLists.add("a");
forEachLists.add("b");
forEachLists.add("c");

forEachLists.stream().forEach(s->System.out.println(s));

4、返回特定结果集合(limit/skip)

  • limit返回Stream的前面n个元素
  • skip则是跳过前n个元素
List<String> forEachLists = new ArrayList<>();

forEachLists.add("a");
forEachLists.add("b");
forEachLists.add("c");
forEachLists.add("d");
forEachLists.add("e");
forEachLists.add("f");

List<String> limitLists = forEachLists.stream()
    .skip(2)
    .limit(3)
    .collect(Collectors.toList());
//先跳过前2个元素
//再取Stream剩余元素的前3,生成新的Stream并返回

5、排序(sort/min/max/distinct)

  • sort可以对集合中的所有元素进行排序。
  • max,min可以找出Stream中最大/最小的元素。
  • distinct可以寻找出不重复的元素。
//1.对集合排序
List<Integer> sortLists = new ArrayList<>();
sortLists.add(1);
sortLists.add(4);
sortLists.add(6);
sortLists.add(3);
sortLists.add(2);

List<Integer> afterSortLists = sortLists.stream()
    .sorted((In1,In2)->In1-In2)
    .collect(Collectors.toList());

//2.获取最大长度的元素
List<String> maxLists = new ArrayList<>();
maxLists.add("a");
maxLists.add("b");
maxLists.add("c");
maxLists.add("d");
maxLists.add("e");
maxLists.add("f");
maxLists.add("hahaha");

int maxLength = maxLists.stream()  //获取列表中最长元素的长度
    .mapToInt(s->s.length())
    .max().getAsInt();

//3.对集合进行查重
List<String> distinctList = new ArrayList<>();
distinctList.add("a");
distinctList.add("a");
distinctList.add("c");
distinctList.add("d");

List<String> afterDistinctList = distinctList.stream()
    .distinct()//去重
    .collect(Collectors.toList())

6、匹配(Match相关)

有时,我们需要判断集合中是否全部满足条件,或判断集合中是否存在满足条件的元素,此时就可以使用match方法:

  • allMatch:Stream中全部元素扶额传入的predicate,返回true;
  • anyMatch:Stream中任何一个元素符合传入的predicate,返回true;
  • noneMatch:Stream中不存在元素符合传入的predicate,返回true;
List<String> matchList = new ArrayList<>();
matchList.add("a");
matchList.add("");
matchList.add("a");
matchList.add("c");
matchList.add("d");

//1.判断集合中是否存在“c”的字符串元素
Boolean isExits = matchList.stream()
    .anyMatch(s->s.equals("c"));


//2.判断集合中是否全不为空
Boolean isAllNull = matchList.stream()
    .allMatch(s->s.isNotEmpty());

Boolean isAllNull2 = matchList.stream()
    .noneMatch(s->s.isEmpty());

猜你喜欢

转载自blog.csdn.net/weixin_40849588/article/details/107634546
今日推荐