首页 > 其他分享 >JDK8新特性(二)--- Option\Stream\函数式接口

JDK8新特性(二)--- Option\Stream\函数式接口

时间:2023-05-10 19:22:05浏览次数:50  
标签:Option Stream newList System --- println Optional out

Optional

Optional是一个没有子类的工具类,Optional是一个可以为null的容器对象。它的作用主要就是为了解决避免Null检查,防止NullPointerException。

//常用方法
Optional.of(T t) : 创建一个 Optional 实例
Optional.empty() : 创建一个空的 Optional 实例
Optional.ofNullable(T t):若 t 不为 null,创建 Optional 实例,否则创建空实例

isPresent() : 判断是否包含值,包含值返回true,不包含值返回false
get() : 如果Optional有值则将其返回,否则抛出NoSuchElementException
orElse(T t) : 如果调用对象包含值,返回该值,否则返回参数t
orElseGet(Supplier s) :如果调用对象包含值,返回该值,否则返回 s 获取的值
map(Function f): 如果有值对其处理,并返回处理后的Optional,否则返回 Optional.empty()
map(Function f): 如果有Optional值对其处理,并返回处理后的Optional,否则返回 Optional.empty()
    
map中获取的返回值自动被Optional包装,即返回值 -> Optional<返回值>
flatMap中返回值保持不变,但必须是Optional类型,即Optional<返回值> -> Optional<返回值>
    
    
//进一步用法
//ifPresent() : 
	// 存在做的什么
	userNameO.ifPresent(s -> System.out.println("用户名为" + s));
//ifPresentOrElse():
	// 存在做的什么,不存在做点什么
	userNameO.ifPresentOrElse(s -> System.out.println("用户名为" + s)
		, () -> System.out.println("用户名不存在"));
	}

Stream流

1666227337606

其他高级用法方法:

find

Optional<T> findFirst();
Optional<T> findAny();

@Test
public void testFind() {
	Optional<Integer> first = Stream.of(5, 3, 6, 1).findFirst();
	System.out.println("first = " + first.get());
	Optional<Integer> any = Stream.of(5, 3, 6, 1).findAny();
	System.out.println("any = " + any.get());
}

max/min

Optional<T> max(Comparator<? super T> comparator);
Optional<T> min(Comparator<? super T> comparator);

reduce

将数据做归纳

Optional<T> reduce(BinaryOperator<T> accumulator);

T reduce(T identity, BinaryOperator<T> accumulator);

<U> U reduce(U identity,
                 BiFunction<U, ? super T, U> accumulator,
                 BinaryOperator<U> combiner);

可以map和reduce组合使用

concat 合并流

如果有两个流,希望合并成为一个流,那么可以使用 Stream 接口的静态方法 concat :
static Stream concat(Stream<? extends T> a, Stream<? extends T> b)
备注:这是一个静态方法,与 java.lang.String 当中的 concat 方法是不同的。

并行流

@Test
public void testgetParallelStream() {
	ArrayList<Integer> list = new ArrayList<>();
	// 直接获取并行的流
	// Stream<Integer> stream = list.parallelStream();
	// 将串行流转成并行流
	Stream<Integer> stream = list.stream().parallel();
}

线程安全问题

并行流存在线程安全问题,循环1000次打印结果却没有1000:

        List<Integer> newList = new ArrayList<>();
        // 使用并行的流往集合中添加数据
        list.parallelStream()
                .forEach(s -> {
                    newList.add(s);
                });
        System.out.println("newList = " + newList.size());
1、加锁

在添加数据时加锁

        List<Integer> newList = new ArrayList<>();
        // 使用并行的流往集合中添加数据
        Object o = new Object();
        list.parallelStream().forEach(s -> {
                    synchronized (o){
                        newList.add(s);
                    }
                });
        System.out.println("newList = " + newList.size());
2、Collections工具类
        List<Integer> newList = Collections.synchronizedList(new ArrayList<>());
        // 使用并行的流往集合中添加数据
        list.parallelStream().forEach(s -> {
                    newList.add(s);
                });
        System.out.println("newList = " + newList.size());
3、同步容器

通过并行流将List中的数据转存到另一个线程安全的Vector集合中*

        List<Integer> newList = new Vector<>();
        // 使用并行的流往集合中添加数据
        list.parallelStream().forEach(s -> {
                    newList.add(s);
                });
        System.out.println("newList = " + newList.size());
4、并发容器

使用并发容器CopyOnWriteArrayList+并行流

        List<Integer> newList = new CopyOnWriteArrayList<>();
        // 使用并行的流往集合中添加数据
        list.parallelStream().forEach(s -> {
                    newList.add(s);
                });
        System.out.println("newList = " + newList.size());

函数式接口

  1. Supplier接口

https://blog.csdn.net/qq_31635851/article/details/116497765

@FunctionalInterface
public interface Supplier<T> {
	public abstract T get();
}
  1. Consumer接口

https://moonce.blog.csdn.net/article/details/116207886

@FunctionalInterface
public interface Consumer<T> {
public abstract void accept(T t);
}
  1. Function接口

https://moonce.blog.csdn.net/article/details/116593033

@FunctionalInterface
public interface Function<T, R> {
	public abstract R apply(T t);
}
  1. Predicate接口

https://moonce.blog.csdn.net/article/details/116484594

@FunctionalInterface
public interface Predicate<T> {
	public abstract boolean test(T t);
}

标签:Option,Stream,newList,System,---,println,Optional,out
From: https://www.cnblogs.com/evenIer/p/17389070.html

相关文章

  • python基础学习-if-while-for-input-print
    """字符串格式化:方式2:f“{变量/表达式}{变量/表达式}”不理会类型,不做精度控制方式1:”%占位“%(变量/表达式)包括(%d%f%s)%m.nm控制显示位数,n控制精度小数点后几位,四舍五入"""name="家和"age=20print(f"我是{name},我{age}岁了")"""inp......
  • python基础学习-JSON
    """JSON:轻量级数据交互格式本质上是带有特定格式的字符串主要功能:在各种编译语言流通的数据格式,负责不同编译语言之间的数据传递和交互中转数据格式格式:{"name":"admin","age":18}字典或[{"name":"admin","age":18},{"name":"admin",&quo......
  • python基础学习-模块导入
    """一模块导入:[from模块名]import[模块|类|变量|函数|*][as别名]常用:import模块名from模块名import方法|类|变量from模块名import*import模块名as别名from模块名import功能名as别名如果模块中有_all_变量,当使用fromxxximport*导入时,只能......
  • python基础学习-列表
    """数据容器""""""列表:list#字面量[元素1,元素2,元素3]#定义变量变量名称=[元素1,元素2,元素3]#定义空列表变量名称=[]变量名称=list()#列表可以存储多个数据,且可以为不同的数据类型,支持嵌套my_list=[1,[2,3],4]下标索引,从0开始my_list=["it","my",34,......
  • python基础学习-序列-切片
    """序列:连续,有序,可使用下标索引的数据容器列表,元组,字符串切片:序列:[起始下标:结束下标:步长]起始留空,从0,结束留空,截至到尾,不含结束下标步长为1,一个个取,可省步长为2,跳一个元素取步长为n,跳n-1个元素取取最后一个元素,下标为-1element=my_list[-1]等同于序列反转result=my_l......
  • python基础学习-字符串
    """str字符串下标索引,从0开始my_str="hello"my_str[0]取"h"可以反向索引,从后往前,从-1开始,一次递减my_str[-1]取o不可修改的数据容器方法:1.查找某元素下标字符串.index(字符串)2.字符串替换新字符串=字符串.replace(字符串1,字符串2)字符串2替换字符串1,字符......
  • python基础学习-集合
    """集合:无序,不允许重复,不支持下标索引,允许修改#字面量{元素1,元素2,元素3}#定义变量变量名称={元素1,元素2,元素3}#定义空集合变量名称=set()方法:1.添加新元素集合.add(元素)2.移除元素集合.remove(元素)3.随机取出元素element=集合.pop()4.清空......
  • python基础学习-元组
    """元组:一旦定义完成,不可修改需要在程序中封装数据,但不希望数据被篡改,使用元组同列表#字面量(元素1,元素2,元素3)#定义变量变量名称=(元素1,元素2,元素3)#定义空列表变量名称=()变量名称=tuple()元组可以存储多个数据,且可以为不同的数据类型,支持嵌套my_list=(1,(......
  • 计组(risv-c)第一章
    第一章   第一章  1.1引言2.如前所述,软件和硬件都会影响程序的性能。请思考以下哪个例子属于性能瓶颈。·所选算法·编程语言或编译器·操作系统·处理器·I/O系统和设备答:  性能瓶颈指的是影响程序性能的最大限制因素,也就是整个系统中影响程序运......
  • nginx stream 模块
    stream模块一般用于tcp/UDP数据流的代理和负载均衡,用来实现四层协议的转发可以通过stream模块代理转发TCP消息。ngx_stream_core_module模块由1.9.0版提供。1.nginx-V确保nginx安装了–with-stream如果没有,重新用yuminstallnginx-y安装2.安装yum-yinstallepel-releas......