Java

不可变集合

  • 如果某个数据不能修改,把它防御性地拷贝到不可变集合红是个很好的实践
  • 或者当集合对象被不可信的库调用时,不可变形式是安全的

创建

  • 再List,Set,Map接口中,都存在of方法,可以创建一个不可变的集合
方法名称 说明
static List of(E...elements) 创建一个具有指定元素的List集合对象
static Set of(E...elements) 创建一个具有指定元素的Set集合对象
static <K,V> Map<K,V> of(E...elements) 创建一个具有指定元素的Map集合对象
  • 创建完成后不能添加,不能修改,不能删除.

Stream流

概述

  • 再Java 8 中,得意于Lambda所带来的函数式编程,引入了一个全新的Stream流概念
  • 目的:用于简化集合和数组操作的API
package com.yu.Day0525Demo;

import java.util.ArrayList;
import java.util.Collections;
import java.util.List; public class StreamTest {
public static void main(String[] args) {
List<String> lists = new ArrayList<>();
Collections.addAll(lists,"张无忌","周芷若","赵敏","张三丰","张强","张xx");
System.out.println(lists); // List<String> ZhangLists = new ArrayList<>();
// for (String list:lists
// ) {
//筛选姓张的
// if(list.startsWith("张")){
// 筛选姓名长度为三个字的
// if(list.length() == 3){
// ZhangLists.add(list);
// }
// }
// }
// System.out.println(ZhangLists);
// lists.stream().filter(s -> s.startsWith("张")).filter(s -> s.length() == 3).forEach(s -> System.out.println(s));
lists.stream().filter(s -> s.startsWith("张") && s.length() == 3).forEach(s -> System.out.println(s));
}
}
思想和使用步骤
  • 先得到集合或者数组的Stream流.
  • 把元素放上去
  • 然后就用这个Stream流简化的API来方便的操作元素

三类方法

获取Stream流
  • 创建一条流水线,并把数据放到流水线上准备进行操作

Stream操作集合或者数组的第一步是先得到Stream流,然后才能使用流的功能

集合获取Stream流的方式
  • 可以使用Collection接口中的默认方法stream()生成流

  • 名称 什么
    default Stream stream() 获取当前集合对象的Stream流
数组获取Stream流的方式
名称 说明
public static Stream stream(T[] array) 获取当前数组的Stream流
public static Stream of(T...values) 获取当前数组/可变数据的Stream流
package com.yu.Day0526Demo;

import java.util.*;
import java.util.stream.Stream; public class StreamDemo01 {
public static void main(String[] args) {
/**---------------Colleaction集合获取流---------------**/
Collection<String> list = new ArrayList<>();
Stream<String> s = list.stream();
/**---------------Map集合获取流---------------**/
Map<String,Integer> maps = new HashMap<>();
//获取键流
Stream<String> keys = maps.keySet().stream();
//获取值流
Stream<Integer> values = maps.values().stream();
//键值对流
Stream<Map.Entry<String,Integer>> keyvalues = maps.entrySet().stream();
/**---------------数组获取流---------------**/
String[] names = {"yu","xiao","yu"};
Stream<String> nameStream = Arrays.stream(names);
Stream<String> nameStream2 = Stream.of(names);
System.out.println();
}
}
中间方法
  • 流水线上的操作,一次操作完毕之后,还可以继续进行其他操作
名称 说明
Stream filter(Predicate<? super T> predicate) 用于对流中的数据进行过滤
Stream limit(long maxSize) 获取前几个元素
Stream skip(long n) 跳过前几个元素
Stream distinct() 去除流中重复的元素.依赖(hashCode和equals方法)
static Stream concat(Stream a,Stream b) 合并a和b两个流为一个流
注意
  • 中间方法也称为非终结方法,调用完成后返回新的Stream流可以继续使用,支持链式编程
  • 在Stream流中无法直接修改集合,数组中的元素
package com.yu.Day0526Demo;

import java.util.ArrayList;
import java.util.List;
import java.util.function.Predicate;
import java.util.stream.Stream; public class StreamAPI01 {
public static void main(String[] args) {
List<String> names = new ArrayList<>();
names.add("张无忌");
names.add("周芷若");
names.add("张三丰");
names.add("赵敏");
names.add("张强");
names.add("张弓长"); //Stream<T> filter(Predicate<? super T> predicate)
//对流中数据进行过滤
// names.stream().filter(new Predicate<String>() {
// @Override
// public boolean test(String s) {
// return s.startsWith("张");
// }
// });
names.stream().filter(s -> s.startsWith("张")).forEach(s -> System.out.println(s));
long size = names.stream().filter(s->s.length()==3).count();
System.out.println(size);
names.stream().filter(s -> s.length() == 3).limit(2).forEach(s -> System.out.println(s));
System.out.println("---------我是一条分界线-----------");
names.stream().filter(s -> s.length() == 3).skip(2).forEach(System.out::println);
System.out.println("---------我是一条分界线-----------");
// names.stream().map(s -> "金庸的:"+s).forEach(s -> System.out.println(s));
//将集合放到对象中
names.stream().map(s -> new Student(s)).forEach(s -> System.out.println(s));
// 方法引用 构造器引用
names.stream().map(Student::new).forEach(System.out::println);
//合并流
Stream<String> s1 = names.stream().filter(s -> s.length() == 3);
Stream<String> s2 = Stream.of("yu","xiao");
Stream.concat(s1,s2).forEach(s-> System.out.println(s));
}
}
终结方法
  • 一个Stream流只能有一个终结方法,是流水线上的最后一个操作

  • 名称 说明
    void forEach(Consumer actiog) 对此流的每个元素指向遍历操作
    long count() 返回此流中的元素个数
  • *** 注意:终结操作方法,调用完成流就无法继续使用了,原因是不会返回Stream了

总结

终结和非终结方法的含义是什么?

终结方法后流不可以继续使用,非终结方法会返回新的流,支持链式编程

Javaheima12的更多相关文章

随机推荐

  1. Linux&Android相关常用命令汇总记录

    Linux&Android相关常用命令汇总记录 0@Linux&Android系统命令行下如何查看命令的帮助信息: command --help 1@在Linux系统中,设备分为三类, ...

  2. 百题计划-3 codeforces 657div2 C. Choosing flowers 贪心+枚举+二分

    https://codeforces.com/contest/1379/problem/C 题意: 给m种花(a,b),从中取出n朵,每种花可以取0和无限朵,如果取出第i朵花的个数为c>0,则贡 ...

  3. Oversampling Techniques

    ADC Operation Improving ADC Resolution 总结 根据奈奎斯特采样定理,Fsample >= 2 * Fsignal 在频域中,过采样能够降低白噪声功率谱密度 ...

  4. kotlin channel使用注意点

    kotlinx.coroutines.channels.ClosedSendChannelException: Channel was closed at kotlinx.coroutines.cha ...

  5. ubuntu添加新硬盘进行分区,并挂载到/home

    ubuntu添加新硬盘,进行分区,并挂载到/home目录. 1.查看已有的磁盘,可以看到sdb还没有分区. > sudo fdisk -l 可以看到各个硬盘的设备名,一般以sda.sdb.sdc ...

  6. TCC事务解决方案

    适用场景: 适用于具有强隔离性,严格一致性要求,也适用执行时间比较短的业务. 方案优缺点 优点: 1)在应用层实现具体逻辑,锁定资源的粒度小,不会锁定所有资源,性能比较高 2)Confirm阶段和Ca ...

  7. java连接couchbase的memcache

    没有参考代码的时候重新写还是有点累的,这是重温了,第一次写的时候参考了别的一些乱七八糟的代码,虽然不是和这个一样的,不过在不懂的情况下还是很快写出来了,反而是这次光是找需要哪些jar都搞了半天,最后发 ...

  8. C语言 数据编码方式

    一.整形数据类型 1.无符号数的编码 无符号数指的是整个机器字长的全部位数均表示数值位. 我们用函数      来进行运算.(B2U是Binary to Unsigned的缩写,长度为w),x代表为0 ...

  9. Android 内存优化浅析

    一:内存占用几大要点 1,Object Cache:Image cache,single instance obj(重量级别,例如数据库连接obj,bitmap ref),Thread过多, 2,Vi ...

  10. php 合并,拆分,追加,查找,删除数组教程

    1. 合并数组 array_merge()函数将数组合并到一起,返回一个联合的数组.所得到的数组以第一个输入数组参数开始,按后面数组参数出现的顺序依次迫加.其形式为: array array_merg ...