一文了解Stream流(超详细+干货满满)

Stream流是对集合对象功能的增强,专注于对集合对象进行各种便利、高效的聚合操作或者大批量数据操作

//java.util.Collection.stream()方法用集合创建流
//Arrays.asList是将数组转化成List集合的方法
List<String> list = Arrays.asList("hello","world","stream");
//创建顺序流
Stream<String> stream = list.stream();
//创建并行流
Stream<String> parallelStream = list.parallelStream();
//java.util.Arrays.stream(T[] array)方法用数组创建流
String[] array = {"h", "e", "l", "l", "o"};
Stream<String> arrayStream = Arrays.stream(array);

filter:筛选,是按照一定的规则校验流中的元素,将符合条件的元素提取到新的流中的操作

public static void main(String[] args) {
    List<Integer> list = Arrays.asList(6, 7, 3, 8, 1, 2);
    Stream<Integer> stream = list.stream();
    stream.filter(x -> x > 5).forEach(System.out::println);
}
//结果如下:
6
7
8

 映射(map、flatMap、peek)

map:一个元素类型为T的流转换成元素类型为R的流,这个方法传入一个Function的函数式接口,接收一个泛型T,返回泛型R,map函数的定义,返回的流,表示的泛型是R对象,简言之将集合中的元素A转换成想要得到的B

flatMap:接收一个函数作为参数,将流中的每个值都换成另一个流,然后把所有流连接成一个流。

简言之:与Map功能类似,区别在于将结合A的流转换成B流

 distinct:简而言之就是去重

Stream<String> stream = Stream.of("1", "3","4","10","4","6","23","3");
stream.distinct().forEach(System.out::println);
 
//输出
1
3
4
10
6
23

 forEach:该方法接收一个Lambda表达式,然后在Stream的每一个元素上执行该表达式

List<String> strAry = Arrays.asList( "Jhonny", "David", "Jack", "Duke", "Jill","Dany","Julia","Jenish","Divya");
 
strAry.stream().forEach(s-> {
			if("Jack".equalsIgnoreCase(s)) System.out.println(s);
		});
 
//输出
Jack

 collect:称为收集器,是一个终端操作,它接收的参数是将流中的元素累积到汇总结果的各种方式

//把流中所有元素收集到List中
List<Menu> menus=Menu.getMenus.stream().collect(Collectors.toList());
//把流中所有元素收集到Set中,删除重复项
Set<Menu> menus=Menu.getMenus.stream().collect(Collectors.toSet());
//把流中所有元素收集到给定的供应源创建的集合中
ArrayList<Menu> menus=Menu.getMenus.stream().collect(Collectors.toCollection(ArrayList::new));
//对流中元素的一个整数属性求和
Long count=Menu.getMenus.stream().collect(counting);
//计算流中元素integer属性的平均值
Integer count=Menu.getMenus.stream().collect(summingInt(Menu::getCalories));
//连接流中每个元素的toString方法生成的字符串
Double averaging=Menu.getMenus.stream().collect(averagingInt(Menu::getCalories));
//一个包裹了流中按照给定比较器选出的最大元素的optional,如果为空返回的是Optional.empty()
Optional<Menu> fattest=Menu.getMenus.stream().collect(maxBy(Menu::getCalories));
//一个包裹了流中按照给定比较器选出的最小元素的optional,如果为空返回的是Optional.empty()
 Optional<Menu> lessest=Menu.getMenus.stream().collect(minBy(Menu::getCalories));
//max:根据提供的Comparator返回此流的最大元素
List<Integer> num = Arrays.asList( 4, 5, 6);
num.stream().max(Integer::compareTo).ifPresent(System.out::println);
 
//输出
6
//min:根据提供的Comparator返回此流的最小元素
List<Integer> num = Arrays.asList( 4, 5, 6);
num.stream().min(Integer::compareTo).ifPresent(System.out::println);
 
//输出
4
//count:返回此流中的元素计数
List<Integer> num = Arrays.asList( 4, 5, 6);
System.out.println(num.stream().count());
 
//输出
3

 整体举例

return userList.stream().filter(user -> {
            String userTags = user.getTags();
            if (StringUtils.isBlank(userTags)){
                return false;
            }
            Set<String> tagNameSet = gson.fromJson(userTags, new TypeToken<Set<String>>() {}.getType());
            for (String tagName : tagNameSet) {
                //若有标签不存在
                if (!tagNameSet.contains(tagName)) {
                    return false;
                }
            }
            //所有标签都存在
            return true;
        }).map(this::getSafetyUser).collect(Collectors.toList());
  • 18
    点赞
  • 11
    收藏
    觉得还不错? 一键收藏
  • 打赏
    打赏
  • 1
    评论
LVS(Linux Virtual Server)是一种基于 Linux 系统的负载均衡集群技术,它主要用于将网络量分发到多个服务器上,以提高系统的可靠性、可扩展性和性能。 LVS 集群一般包括四个组件:调度器(LVS 调度器)、前端服务器(负载均衡器)、后端服务器(真实服务器)和存储服务器(用于共享数据)。首先,调度器接收来自客户端的请求,然后根据配置的调度算法(如轮询、加权轮询、最小连接数等)将请求分发到多个前端服务器。前端服务器接收到请求后,通过相应的负载均衡算法将请求转发到后端的真实服务器上进行处理。在整个过程中,存储服务器用于存放共享的数据,以确保所有的真实服务器都能获取到相同的数据,并提供一致的服务。 LVS 集群的优点是能够提高网站的稳定性和可靠性,当某一台服务器出现故障时,调度器会自动将请求分发到其他可用的服务器上,从而保证服务的连续性。同时,LVS 集群还能够通过增加前端服务器和后端服务器的数量来提高系统的性能和吞吐量,以满足不断增长的用户需求。 在实际应用中,LVS 集群需要合理配置,包括选择合适的调度算法、调整每台服务器的权重、选择适当的硬件设备等。此外,还需要及时监控集群的运行状态,及时发现和解决故障,以确保整个系统的正常运行。 总的来说,LVS 负载均衡集群是一种强大而高效的集群技术,能够帮助企业提高系统的可靠性和性能,是现代互联网应用中不可或缺的重要组成部分。

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

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

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

GeekInk失控

你的鼓励将是我创作的最大动力

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

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

余额充值