>  기사  >  Java  >  Java에서 스트림 흐름 인스턴스 분석

Java에서 스트림 흐름 인스턴스 분석

PHPz
PHPz앞으로
2023-05-09 16:10:20644검색

    Stream

    이전 기사에서는 Java 8의 새로운 기능인 람다 표현식을 비즈니스에 능숙하게 사용하면 많은 코드를 절약하고 훨씬 깔끔하게 보일 수 있다고 설명했습니다. 그런 다음 이 기사에서는 또 다른 새로운 기능인 StreamStream을 소개합니다. 잘못 읽지 마세요! ! ! 게임steam을 하기 위한 것이 아닙니다! !

    1. 스트림이란?

    Stream은 Java 8에서 제안한 새로운 개념입니다. 입출력 스트림이 아니라(실제로 IO 스트림과 관련이 없습니다)을 사용하는 함수입니다. 프로그래밍 방식 컬렉션 클래스 운영을 위한 도구입니다. 간단히 말해서 내부 반복 방식으로 컬렉션 데이터를 처리하는 작업입니다. 내부 반복을 통해 컬렉션 클래스에 더 많은 제어권을 부여할 수 있습니다. Stream과 Iterator의 기능은 유사하지만 Iterator는 외부 반복 형식으로 컬렉션 데이터를 처리하는 작업이라는 점만 다릅니다.

    물론 Stream에도 고유한 특성이 있습니다.

    1. 이는 데이터 구조가 아니며 데이터를 저장하지 않습니다.

    2 이러한 작업은 게으른 작업입니다. 즉, 액세스할 때마다 스트림의 요소만 이 요소에 대해 이러한 일련의 작업을 수행합니다

    3. 데이터가 저장되지 않으므로 각 스트림은 한 번만 사용할 수 있습니다.

    Stream 스트림 구현 다이어그램:

    Java에서 스트림 흐름 인스턴스 분석

    2. 스트림 생성:

    Stream 스트림을 사용하여 컬렉션을 운영하려면 배열 또는 컬렉션을 Stream 스트림으로 변환해야 운영할 수 있습니다.

    Stream 공식 문서:

    https://docs.oracle.com/en/java/javase/17/docs/api/java.base/java/util/stream/Stream.html

    먼저 네 가지 방법을 살펴보겠습니다.

    1.filter: 람다 식을 사용하여 조건부 필터링 구현

    2.limit: 스트림 가로채기, 스트림 섹션 가로채기

    3.skip: 오버플로 건너뛰기

    4.distinct: 중복 제거

    스트림 생성:

    public class Test {
        public static void main(String[] args) {
            String [] arr = {"东","南","西","北"};
            //将数组转换成Stream
            Stream<String> stream = Arrays.stream(arr);
            stream = Stream.of(arr);
            stream = Stream.of("东","南","西","北");
            //将list集合转换成stream
            List<String> list = Arrays.asList("aa","cc","bb","aa","dd");
            stream = list.stream();
            //排序、去重、遍历
            list.stream().sorted().distinct().forEach(System.out::println);
            //用过Stream流操作完集合后还可以再转换成一个新的集合
            List<String> newList = list.stream().sorted().distinct().collect(Collectors.toList());
            System.out.println(newList.toString());
        }
    }

    출력:

    //중복 항목을 탐색하고 제거한 후의 결과:

    aa
    bb
    cc
    dd
    //Used Stream 스트림이 컬렉션을 운영한 후 새로운 컬렉션으로 변환할 수 있습니다.
    [aa, bb, cc, dd]

    네 가지 작업 방법: Person 클래스:

    이 클래스에는 get/set 메소드가 작성되어 있지 않은 많은 코드, 사용할 때 잊지 마세요! !

    public class Person {
        private String  name;
        private Integer age;
        private  String country;
        private  char sex;
        @Override
        public String toString() {
            return "信息表:{" +
                    "name=&#39;" + name + &#39;\&#39;&#39; +
                    ", age=" + age +
                    ", country=&#39;" + country + &#39;\&#39;&#39; +
                    ", sex=" + sex +
                    &#39;}&#39;;
        }
    //这里节省的get/set代码
    //重写toString() 和 equals 和 hashcode 方法
        @Override
        public boolean equals(Object o){
            if(this == o)
                return true;
            if(o == null || getClass() != o.getClass())
                return false;
            Person person = (Person) o;
            if(country != null){
                if(this.country.equals(person.country)){
                    return  true;
                }else{
                    return false;
                }
            }
            return false;
        }
        @Override
        public int hashCode(){
            return Objects.hash(country);
        }
    }

    테스트 클래스:

    람다 표현식을 결합하여 작성

    public class Test {
        public static void main(String[] args) {
            List<Person> perosnList = new ArrayList<>();
            perosnList.add(new Person("王一", 30, "中国", &#39;M&#39;));
            perosnList.add(new Person("张三", 19, "美国", &#39;F&#39;));
            perosnList.add(new Person("李四", 29, "日本", &#39;F&#39;));
            perosnList.add(new Person("小美", 74, "英国", &#39;M&#39;));
            perosnList.add(new Person("熊二", 15, "意大利", &#39;F&#39;));
            perosnList.add(new Person("熊大", 66, "韩国", &#39;F&#39;));
            //返回年龄大于20岁的学生集合
            System.out.println("返回年龄大于20岁的学生集合");
            perosnList.stream().filter(p -> p.getAge() > 20).forEach(System.out::println);
            //返回年龄大于50岁的学生集合
            System.out.println("返回年龄大于50岁的集合");
            List<Person> list = perosnList.stream().filter(p -> p.getAge() > 50).collect(Collectors.toList());
            System.out.println(list);
            //返回年龄大于20岁的中国学生
            System.out.println("返回年龄大于20岁的中国人");
            perosnList.stream().filter(p -> p.getAge() > 20).filter(p -> p.getCountry().equals("韩国")).forEach(System.out::println);
            //年龄大于20  中国  性别M
            System.out.println("返回年龄大于20  中国  性别M");
            perosnList.stream().filter(p -> p.getAge() > 20 && p.getCountry().equals("中国") && p.getSex() == &#39;M&#39;).forEach(System.out::println);
        }
    }

    결과 보기:

    20세 이상의 학생 컬렉션 반환

    정보 테이블: {name='王一' , age=30, country='중국', sex=M}
    정보 테이블: {name='lee思', age=29, country='일본', sex=F}
    정보 테이블: {name='Xiao 메이', age=74, country='UK', sex=M}
    정보 테이블: {name='Xiong Da', age=66, country='South Korea', sex=F}
    사람 컬렉션을 반환합니다. 50세 이상
    [정보 테이블: {name='Xiaomei', age=74, country='UK', sex=M}, 정보 테이블: {name='Xiong Da', age=66, country=' South Korea', sex =F}]
    20세 이상의 중국인을 반환합니다
    정보 테이블: {name='Xiong Da', age=66, country='South Korea', sex=F}
    인을 반환합니다 20세 이상 중국 성별 M
    정보 테이블 :{name='王一', age=30, country='China', sex=M}

    요약:

    스트림 스트림을 사용하면 쉽게 배열이나 컬렉션을 연산하고, 람다 표현식과 결합해 만들 수도 있다. 표현식은 깔끔하고 명확하다. 사실 자바에서 나온 새로운 기능이기 때문에 유용할 것이다.

    3. Stream의 지도 매핑 스트림

    public class Test {
        public static void main(String[] args) {
            //map的作用是迭代取到每个list元素,再通过map里面的函数进行相应的操作
            List<String> list1 = Arrays.asList("a","bb","ccc","dddd");
            //通过map取到每个集合元素的长度并返回
            Stream<Integer> stream = list1.stream().map(p->p.length());
            stream.forEach(System.out::println);
            System.out.println("----------------");
            List<String> userList = new ArrayList<>();
            userList.add("周杰伦.tom");
            userList.add("尼古拉斯.赵四");
            userList.add("牛顿.巴基斯");
            userList.add("赵少华.思密达");
            List<String> uList = userList.stream().map(p->p.substring(p.indexOf(".")+1,
                    p.length())).collect(Collectors.toList());
            System.out.println(uList.toString());
        }
    }

    출력:

    1

    2
    3
    4
    ----------------
    [tom, Zhao Si, Pakistan , Smecta]

    4. 스트림 검색 및 매칭

    Stream에도

    메소드가 있습니다:  anyMatch(Predicate predicate)

    이 스트림의 요소가 제공된 단어와 일치하는지 여부를 반환합니다

    Demo:

    public class Test {
        public static void main(String[] args) {
            List<String> list = Arrays.asList("周杰伦","王力宏","孙燕姿","林俊杰");
            boolean flag1 = list.stream().anyMatch(ele->ele.contains("燕"));
            System.out.println("有没有名字包含燕的同学:"+flag1);
            //判断开头:
            boolean flag2 = list.stream().anyMatch(ele->ele.startsWith("王"));
            System.out.println("有没有名字开头是王的同学:"+flag2);
            //判断结尾:
            boolean flag3 = list.stream().anyMatch(ele->ele.endsWith("杰"));
            System.out.println("有没有名字结尾是杰的同学:"+flag3);
            // anyMatch是匹配所有的,要满足条件
            boolean flag4 = list.stream().anyMatch(ele->ele.length()>2);
            System.out.println("所有同学的名字都是两个字以上的吗"+flag4);
            boolean flag5 = list.stream().anyMatch(ele->ele.startsWith("王"));
            System.out.println("所有同学的名字都有王吗?"+flag5);
            //noneMatch
            boolean flag6 = list.stream().noneMatch(ele->ele.contains("燕"));
            System.out.println("集合中都没有包含&#39;燕&#39;这个字吗"+flag5);
        }
    }

    출력:

    이름에 Yan: true가 포함된 반 친구가 있습니까? 학생들 이름이 모두 왕(Wang)이에요? true

    컬렉션에 'Yan'이라는 단어가 포함되어 있지 않습니까? true


    anyMatch()의 메소드를 사용하면 이 스트림의 정보를 쉽게 일치시킬 수 있습니다.

    위 내용은 Java에서 스트림 흐름 인스턴스 분석의 상세 내용입니다. 자세한 내용은 PHP 중국어 웹사이트의 기타 관련 기사를 참조하세요!

    성명:
    이 기사는 yisu.com에서 복제됩니다. 침해가 있는 경우 admin@php.cn으로 문의하시기 바랍니다. 삭제