jdk8中Stream的使用

本文详细介绍了Java 8中的Stream API,包括其基本概念、操作方式和常见用法,如并行流、过滤、映射、收集等操作,展示了如何通过Stream API简化数据处理和集合操作。

摘要生成于 C知道 ,由 DeepSeek-R1 满血版支持, 前往体验 >

import java.util.*;
import java.util.stream.Collectors;
import java.util.stream.Stream;

public class Test_s {
    public static void main(String[] args) {
        List<Person> personList = new ArrayList<Person>();
        personList.add(new Person("Tom", 8900, "male", "New York"));
        personList.add(new Person("Jack", 7000, "male", "Washington"));
        personList.add(new Person("Lily", 7800, "female", "Washington"));
        personList.add(new Person("Anni", 8200, "female", "New York"));
        personList.add(new Person("Owen", 9500, "male", "New York"));
        personList.add(new Person("Alisa", 7900, "female", "New York"));


        List<Integer> list = Arrays.asList(7, 6, 9, 3, 8, 2, 1);

        //遍历输出符合条件的元素
        list.stream().filter(n->n>6).forEach(System.out::println);

        //匹配第一个
        Optional<Integer> first = list.stream().filter(n -> n <= 6).findFirst();
//        System.out.println(first.get());

        //匹配任意,适用于并行流
        Optional<Integer> any = list.parallelStream().filter(n -> n > 6).findAny();
//        System.out.println(any.get());

        //是否包含符合特定条件的元素
        boolean match = list.stream().allMatch(n -> n < 6);
        System.out.println("匹配第一个值:" + first.get());
        System.out.println("匹配任意一个值:" + any.get());
        System.out.println("是否存在大于6的值:" + match);

        //筛选员工中工资高于8000的人,并形成新的集合
        List<String> collect = personList.stream().filter(n -> n.getSalary() > 8000).map(Person::getName).collect(Collectors.toList());
//        System.out.println(collect);

        List<String> stringlist = Arrays.asList("adnm", "admmt", "pot", "xbangd", "weoujgsd");
        Optional<String> max = stringlist.stream().max(Comparator.comparing(String::length));
//        System.out.println(max.get());

        //获取Integer集合中的最大值。
        List<Integer> integerList = Arrays.asList(7, 6, 9, 4, 11, 6);
        Optional<Integer> integer = integerList.stream().max(Integer::compareTo);
//        System.out.println(integer.get());

        //获取员工工资最高的人
        Optional<Person> max1 = personList.stream().max(Comparator.comparing(Person::getSalary));
//        System.out.println(max1.get());

        //计算integer集合中大于6的元素的个数
        List<Integer> list2 = Arrays.asList(7, 6, 4, 8, 2, 11, 9);
        long count = list2.stream().filter(n -> n > 6).count();
//        System.out.println(count);

        //英文字符串数组的元素全部改为大写,整数数组每个元素+3
        String[] strArr = { "abcd", "bcdd", "defde", "fTr" };
        List<String> collect1 = Arrays.stream(strArr).map(String::toUpperCase).collect(Collectors.toList());
//        System.out.println(collect1);

        List<Integer> intList = Arrays.asList(1, 3, 5, 7, 9, 11);
        List<Integer> collect2 = intList.stream().map(n -> n + 3).collect(Collectors.toList());
//        System.out.println(collect2);

        //将员工的薪资全部增加1000
        List<Person> collect3 = personList.stream().map(person -> {
            Person personNew = new Person(person.getName(), 0, null, null);
            personNew.setSalary(person.getSalary() + 1000);
            return personNew;
        }).collect(Collectors.toList());
//        System.out.println("一次改动前:" + personList.get(0).getName() + "-->" + personList.get(0).getSalary());
//        System.out.println("一次改动后:" + collect3.get(0).getName() + "-->" + collect3.get(0).getSalary());

        // 改变原来员工集合的方式
        List<Person> personListNew2 = personList.stream().map(person -> {
            person.setSalary(person.getSalary() + 1000);
            return person;
        }).collect(Collectors.toList());
//        System.out.println("二次改动前:" + personList.get(0).getName() + "-->" + personList.get(0).getSalary());
//        System.out.println("二次改动后:" + personListNew2.get(0).getName() + "-->" + personListNew2.get(0).getSalary());

        //将两个字符组合成一个新的字符数组
        List<String> list4 = Arrays.asList("m,k,l,a", "1,3,5,7");
        List<String> collect4 = list4.stream().flatMap(s -> {
            String[] strings = s.split(",");
            Stream<String> stream = Arrays.stream(strings);
            return stream;
        }).collect(Collectors.toList());
//        System.out.println("处理前的集合:" + list4);
//        System.out.println("处理后的集合:" + collect4);

        //求integer集合的元素之和、乘积和最大值
        List<Integer> list5 = Arrays.asList(1, 3, 2, 8, 11, 4);
        //求和方式1
        Optional<Integer> sum = list5.stream().reduce((x, y) -> x + y);
        //求和方式2
        Optional<Integer> sum2 = list5.stream().reduce(Integer::sum);
        //求和方式3
        Integer sum3 = list5.stream().reduce(0, Integer::sum);

        //求乘积
        Optional<Integer> reduce = list5.stream().reduce((x, y) -> x * y);

        //求最大值方式1
        Integer max2 = list5.stream().reduce(1, Integer::max);
        //求最大值方式2
        Optional<Integer> reduce1 = list5.stream().reduce((x, y) -> x > y ? x : y);

        //求员工人数
        long count1 = personList.stream().count();
//        System.out.println("员工人数:"+count1);

        //求平均工资
        Double collect5 = personList.stream().collect(Collectors.averagingDouble(Person::getSalary));
//        System.out.println(collect5);

        //求最高工资
        Optional<Integer> collect7 = personList.stream().map(Person::getSalary).collect(Collectors.maxBy(Integer::compare));

        //求工资之和
        Long collect6 = personList.stream().collect(Collectors.summingLong(Person::getSalary));

        // 将员工按薪资是否高于8000分组
        Map<Boolean, List<Person>> part = personList.stream().collect(Collectors.partitioningBy(x -> x.getSalary() > 8000));
        //将员工按性别分组
        Map<String, List<Person>> group = personList.stream().collect(Collectors.groupingBy(Person::getSex));
        // 将员工先按性别分组,再按地区分组
        Map<String, Map<String, List<Person>>> group2 = personList.stream().collect(Collectors.groupingBy(Person::getSex, Collectors.groupingBy(Person::getArea)));

//        System.out.println("员工按薪资是否大于8000分组情况:" + part);
//        System.out.println("员工按性别分组情况:" + group);
//        System.out.println("员工按性别、地区:" + group2);

        //将员工按工资由高到低(工资一样则按年龄由大到小)排序
        List<String> collect8 = personList.stream().sorted(Comparator.comparing(Person::getSalary)).map(Person::getName).collect(Collectors.toList());

        String[] arr1 = { "a", "b", "c", "d" };
        String[] arr2 = { "d", "e", "f", "g" };
        Stream<String> stream1 = Stream.of(arr1);
        Stream<String> stream2 = Stream.of(arr2);
        // concat:合并两个流 distinct:去重
        List<String> collect9 = Stream.concat(stream1, stream2).distinct().collect(Collectors.toList());
        System.out.println("流合并:"+collect9);
        //limit:限制从流中获得前n个数据
        List<Integer> collect10 = Stream.iterate(1, x -> x + 2).limit(10).collect(Collectors.toList());
        System.out.println("limit:" + collect10);
        //skip:跳过前n个数据
        List<Integer> collect11 = Stream.iterate(1, x -> x + 2).skip(1).limit(5).collect(Collectors.toList());
        System.out.println(collect11);
    }
}
内容概要:本文档详细介绍了在三台CentOS 7服务器(IP地址分别为192.168.0.157、192.168.0.158和192.168.0.159)上安装和配置Hadoop、Flink及其他大数据组件(如Hive、MySQL、Sqoop、Kafka、Zookeeper、HBase、Spark、Scala)的具体步骤。首先,文档说明了环境准备,包括配置主机名映射、SSH免密登录、JDK安装等。接着,详细描述了Hadoop集群的安装配置,包括SSH免密登录、JDK配置、Hadoop环境变量设置、HDFS和YARN配置文件修改、集群启动与测试。随后,依次介绍了MySQL、Hive、Sqoop、Kafka、Zookeeper、HBase、Spark、Scala和Flink的安装配置过程,包括解压、环境变量配置、配置文件修改、服务启动等关键步骤。最后,文档提供了每个组件的基本测试方法,确保安装成功。 适合人群:具备一定Linux基础和大数据组件基础知识的运维人员、大数据开发工程师以及系统管理员。 使用场景及目标:①为大数据平台建提供详细的安装指南,确保各组件能够顺利安装和配置;②帮助技术人员快速掌握Hadoop、Flink等大数据组件的安装与配置,提升工作效率;③适用于企业级大数据平台的建与维护,确保集群稳定运行。 其他说明:本文档不仅提供了详细的安装步骤,还涵盖了常见的配置项解释和故障排查建议。建议读者在安装过程中仔细阅读每一步骤,并根据实际情况调整配置参数。此外,文档中的命令和配置文件路径均为示例,实际操作时需根据具体环境进行适当修改。
在无线通信领域,天线阵列设计对于信号传播方向和覆盖范围的优化至关重要。本题要求设计一个广播电台的天线布局,形成特定的水平面波瓣图,即在东北方向实现最大辐射强度,在正东到正北的90°范围内辐射衰减最小且无零点;而在其余270°范围内允许出现零点,且正西和西南方向必须为零。为此,设计了一个由4个铅垂铁塔组成的阵列,各铁塔上的电流幅度相等,相位关系可自由调整,几何布置和间距不受限制。设计过程如下: 第一步:构建初级波瓣图 选取南北方向上的两个点源,间距为0.2λ(λ为电磁波波长),形成一个端射阵。通过调整相位差,使正南方向的辐射为零,计算得到初始相位差δ=252°。为了满足西南方向零辐射的要求,整体相位再偏移45°,得到初级波瓣图的表达式为E1=cos(36°cos(φ+45°)+126°)。 第二步:构建次级波瓣图 再选取一个点源位于正北方向,另一个点源位于西南方向,间距为0.4λ。调整相位差使西南方向的辐射为零,计算得到相位差δ=280°。同样整体偏移45°,得到次级波瓣图的表达式为E2=cos(72°cos(φ+45°)+140°)。 最终组合: 将初级波瓣图E1和次级波瓣图E2相乘,得到总阵的波瓣图E=E1×E2=cos(36°cos(φ+45°)+126°)×cos(72°cos(φ+45°)+140°)。通过编程实现计算并绘制波瓣图,可以看到三个阶段的波瓣图分别对应初级波瓣、次级波瓣和总波瓣,最终得到满足广播电台需求的总波瓣图。实验代码使用MATLAB编写,利用polar函数在极坐标下绘制波瓣图,并通过subplot分块显示不同阶段的波瓣图。这种设计方法体现了天线阵列设计的基本原理,即通过调整天线间的相对位置和相位关系,控制电磁波的辐射方向和强度,以满足特定的覆盖需求。这种设计在雷达、卫星通信和移动通信基站等无线通信系统中得到了广泛应用。
评论 2
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值