Java8新特性之Stream流

package StreamT;

import java.util.ArrayList;
import java.util.stream.Stream;

/**
 * @className: Test01
 * @description: Stream流初尝试
 * @author: CCQ
 * @date: 2021/9/12
 **/

public class Test01 {
    public static void main(String[] args) {
        ArrayList<String> s1 = new ArrayList<>();
        s1.add("林青霞");
        s1.add("棋棋");
        s1.add("风清扬");
        s1.add("张敏");
        s1.add("张曼玉");
        s1.add("张无忌");
        s1.add("刘岩");

        //找出集合中每个字符串首个字符为张的元素,并从这些元素中找出长度等于3的元素,然后将最终的结果打印
        s1.stream().filter(s -> s.startsWith("张")).filter(s -> s.length()==3).forEach(System.out::println);

    }
}


package StreamT;

import java.util.ArrayList;
import java.util.HashMap;
import java.util.HashSet;
import java.util.Map;
import java.util.stream.Stream;

/**
 * @className: Test02
 * @description: Stream流常见的生成方式
 * @author: CCQ
 * @date: 2021/9/12
 **/


/*
* Stream流常见的生成方式
*   1.Collection体系的集合可以使用默认方法stream()生成流
*       default Stream<E> stream();
*   2.Map体系的集合可以间接的生成流,如利用set集合生成流(以下会有例子)
*   3.数组可以通过Stream接口的静态方法of(T... values)生成流
*
* */
public class Test02 {
    public static void main(String[] args) {
        //Collection体系集合生成流
        Stream<String> stream = new ArrayList<String>().stream();
        Stream<String> stream1 = new HashSet<String>().stream();

        //Map体系生成流
        Stream<Map.Entry<String, String>> stream2 = new HashMap<String, String>().entrySet().stream();
        Stream<String> stream3 = new HashMap<String, String>().keySet().stream();
        Stream<String> stream4 = new HashMap<String, String>().values().stream();

        //数组通过Stream接口的静态方法of(T...values)生成流
        String[] s1 ={"hello","java","i love you"};
        Stream<String> s11 = Stream.of(s1);
        Stream<String> hello = Stream.of("hello", "java");
        Stream<Integer> integerStream = Stream.of(10, 20, 30);

    }
}


package StreamT;

import java.util.ArrayList;
import java.util.stream.Stream;

/**
 * @className: Test03
 * @description: Stream流常见中间操作之filter
 * @author: CCQ
 * @date: 2021/9/12
 **/

/*
*   Stream<T> filter(Predicate predicate)用于对流中的数据进行过滤
*   Predicate接口中的方法boolean test(T t),对给定的参数作判断,返回一个布尔值
*
* */
public class Test03 {
    public static void main(String[] args) {
        //创建一个集合
        ArrayList<String> arrayList = new ArrayList<>();
        arrayList.add("林青霞");
        arrayList.add("棋棋");
        arrayList.add("王祖贤");
        arrayList.add("刘岩");
        arrayList.add("张无忌");
        arrayList.add("张曼玉");

        //需求一:输出ArrayList集合中以张开头的元素
        arrayList.stream().filter(s -> s.startsWith("张")).forEach(System.out::println);
        System.out.println("----------------------");
        //需求二:输出ArrayList集合中长度为3的元素
        arrayList.stream().filter(s -> s.length()==3).forEach(System.out::println);
        System.out.println("----------------------");

        //需求三:输出ArrayList集合中以张开头长度为3的元素
        //第一种方式
        arrayList.stream().filter(s -> s.startsWith("张")).filter(s -> s.length()==3).forEach(System.out::println);
        System.out.println("----------------------");
        //第二种方式
        arrayList.stream().filter(s -> s.startsWith("张") && s.length()==3).forEach(System.out::println);


    }

}


package StreamT;

import java.util.ArrayList;

/**
 * @className: limitskipTest
 * @description: Stream流中间操作之limit&skip(截取和跳跃)
 * @author: CCQ
 * @date: 2021/9/13
 **/

/*
* Stream<T> limit(long maxSize)返回此流中的元素组成的流,截取指定参数个数的数据
* Stream<T> skip(long n),跳过指定参数个数的数据,返回由该流的剩余元素组成的流
*
* */

public class limitskipTest {
    public static void main(String[] args) {
        ArrayList<Object> a1 = new ArrayList<>();
        a1.add("林青霞");
        a1.add("林青霞");
        a1.add("棋棋");
        a1.add("王祖贤");
        a1.add("刘岩");
        a1.add("张无忌");
        a1.add("张曼玉");

        //需求1:取前三个元素并打印,这里的distinct是去重
        a1.stream().distinct().limit(3).forEach(System.out::println);
        System.out.println("----------------------------");

        //需求2:跳过3个元素并打印剩余元素
        a1.stream().distinct().skip(3).forEach(System.out::println);
        System.out.println("----------------------------");

        //需求3:跳过2个元素,把剩下元素的前两个在控制台输出
        a1.stream().distinct().skip(2).limit(2).forEach(System.out::println);
        System.out.println("----------------------------");

    }
}


package StreamT;

import java.util.ArrayList;
import java.util.Comparator;

/**
 * @className: sortedTest
 * @description: Stream流之sorted (排序)
 * @author: CCQ
 * @date: 2021/9/13
 **/


/*
* Stream<T> sorted();返回由此流的元素组成的流,根据自然顺序排序
* Stream<T> sorted(Comparator comparator)返回由该流的元素组成的流,根据提供的Comparator进行排序
*       Comparator接口中的方法  int compara(T o1,T o2)
*
* */
public class sortedTest {
    public static void main(String[] args) {
        ArrayList<String> a1 = new ArrayList<>();
        a1.add("林青霞");
        a1.add("林青霞");
        a1.add("王祖贤");
        a1.add("刘岩");
        a1.add("棋棋");
        a1.add("张无忌");
        a1.add("张曼玉");

        //需求1:根据自然排序并打印数据
        a1.stream().sorted().forEach(System.out::println);

        System.out.println("---------------------");
        //需求2:根据字符串长度排序然后打印
        //第一种方式
        a1.stream().sorted((s1,s2) -> s1.length()-s2.length()).forEach(System.out::println);

        System.out.println("---------------------");
        //第二种方式
        a1.stream().sorted((s1,s2)->{
            int num =s1.length()-s2.length();
            int num2 =num==0?s1.compareTo(s2):num;
            return num2;
        }).forEach(System.out::println);

    }
}


package StreamT;

import java.util.ArrayList;
import java.util.stream.Stream;

/**
 * @className: concatdistinctTest
 * @description: Stream流中间操作之concat&distinct(去重)
 * @author: CCQ
 * @date: 2021/9/13
 **/


/*
* static <T> Stream<T> concat(Stream a,Stream b)合并a和b两个流为一个流
* Stream<T> distinct();去重
* */
public class concatdistinctTest {
    public static void main(String[] args) {
        ArrayList<String> a1 = new ArrayList<>();
        a1.add("林青霞");
        a1.add("林青霞");
        a1.add("棋棋");
        a1.add("王祖贤");
        a1.add("刘岩");
        a1.add("张无忌");
        a1.add("张曼玉");

        //需求1:取前四个数据组成一个流
        Stream<String> limit = a1.stream().limit(4);

        //需求2:跳过两个数据组成一个流
        Stream<String> skip = a1.stream().skip(2);

        //需求3:合并需求1和需求2得到的流并打印
        Stream.concat(limit,skip).forEach(System.out::println);
        System.out.println("------------------------------------------");

        //需求4:合并需求1和需求2得到的流并去重打印
        Stream.concat(skip,limit).distinct().forEach(System.out::println);

    }
}



package StreamT;

import java.util.ArrayList;

/**
 * @className: foreachcountTest
 * @description: Stream流终结操作之foreach&count
 * @author: CCQ
 * @date: 2021/9/14
 **/

/*
    void forEach(Consumer action);对此流的每个元素执行操作
            Consumer接口中的方法  void accept(T t);对给定的参数执行此操作
    Long count();返回此流中的元素个数
*/

public class foreachcountTest {
    public static void main(String[] args) {
        ArrayList<String> a1 = new ArrayList<>();
        a1.add("林青霞");
        a1.add("林青霞");
        a1.add("王祖贤");
        a1.add("刘岩");
        a1.add("棋棋");
        a1.add("张无忌");
        a1.add("张曼玉");

        //需求1:打印集合元素
        a1.stream().forEach(System.out::println);
        System.out.println("---------");
        //统计以张开头的元素,并把结果输出
        long num = a1.stream().filter(s -> s.startsWith("张")).count();
        System.out.println(num);
    }
}


package StreamT;

import java.util.ArrayList;
import java.util.Objects;

/**
 * @className: mapmapTointTest
 * @description: Stream流之map,maptoint
 * @author: CCQ
 * @date: 2021/9/14
 **/

/*
* <R> Stream<R> map(Function mapper);返回由给定函数应用于此流的元素的结果组成的流
* Function接口中的方法 R apply(T t)
*
* IntStream mapToInt(TointFunction mapper),返回一个IntStream流其中包含将给定函数应用于此流的元素的结果
*       IntStream:表示原始int流
*          其中IntStream流中有一个常用的方法,Stream流是没有的,需要转换为IntStream流
*          就是int num()方法,可以返回流中元素的总和
*
*       ToIntFunction接口中的方法  int applyAsInt(T value)
*/

public class mapmapTointTest {
    public static void main(String[] args) {
        ArrayList<String> a1 = new ArrayList<>();
        a1.add("300");
        a1.add("100");
        a1.add("20");
        a1.add("50");
        a1.add("45");
        a1.add("457");

        //需求1:将集合中的字符串数据转换为整数之后在控制台输出
        a1.stream().map(Integer::parseInt).forEach(System.out::println);

        System.out.println("----------------");

        int sum = a1.stream().mapToInt(Integer::parseInt).sum();
        System.out.println(sum);
    }
}


	package StreamT;

import java.util.ArrayList;
import java.util.stream.Stream;

/**
 * @className: StreamBigTest
 * @description: Stream流综合练习
 * @author: CCQ
 * @date: 2021/9/14
 **/

/*
    有两个集合分别存储男演员和女演员,现要求
        1.男演员只要名字为3个字的前三人
        2.女演员只要姓林的,并且不要第一个
        3.把过滤后的男女演员合并在一起
        4.把上一步操作后的元素作为构造方法的参数创建演员对象,遍历数据
*/
public class StreamBigTest {
    public static void main(String[] args) {
        ArrayList<String> a1 = new ArrayList<>();
        a1.add("林青霞");
        a1.add("王祖贤");
        a1.add("刘岩");
        a1.add("棋棋");
        a1.add("张无忌");
        a1.add("张曼玉");

        ArrayList<String> a2= new ArrayList<>();
        a2.add("棋1");
        a2.add("林青霞");
        a2.add("林夕");
        a2.add("林小姐");
        a2.add("棋4");
        a2.add("棋5");
        a2.add("棋6");
        a2.add("棋7");

        Stream<String> maleStream = a1.stream().filter(s -> s.length() == 3);
        Stream<String> femaleStream= a2.stream().filter(s -> s.startsWith("林")).skip(1);

        Stream<String> concat = Stream.concat(maleStream, femaleStream);
        concat.map(actor::new).forEach(s-> System.out.println(s.getName()));
        System.out.println("-----------");

        Stream.concat(a1.stream().filter(s -> s.length()==3),a2.stream().filter(s -> s.startsWith("林")).skip(1)).map(actor::new).forEach(s-> System.out.println(s.getName()));

    }
}

class actor{
    private String name;

    public actor(String name) {
        this.name = name;
    }

    public String getName() {
        return name;
    }

    public void setName(String name) {
        this.name = name;
    }
}

package StreamT;

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

/**
 * @className: CollectDemo
 * @description: Stream流之Collection操作 (把流中的数据收集到集合中)
 * @author: CCQ
 * @date: 2021/9/14
 **/


/*
    Stream流的收集方法
     R collect(Collector collector);
    但是这个收集方法的参数是一个Collector接口

    工具类Collectors提供了具体的收集方式
    public static <T> Collector toList():把元素收集到List集合中
    public static <T> Collector toSet():把元素收集到Set集合中
    public static Collector toMap(Function keyMapper,Function valueMapper):把元素收集到Map集合中

*/
public class CollectDemo {
    public static void main(String[] args) {
        ArrayList<String> a1 = new ArrayList<>();
        a1.add("林青霞");
        a1.add("王祖贤");
        a1.add("刘岩");
        a1.add("棋棋");
        a1.add("张无忌");
        a1.add("张曼玉");

        //需求1:得到名字为3个字的流,并把流中的数据收集到List集合中遍历
        Stream<String> stringStream = a1.stream().filter(s -> s.length() == 3);
        List<String> collect = stringStream.collect(Collectors.toList());
        for (String value : collect)
            System.out.println(value);

        HashSet<Integer> h1 = new HashSet<>();
        h1.add(10);
        h1.add(20);
        h1.add(30);
        h1.add(25);
        h1.add(22);
        h1.add(21);

        System.out.println("--------------------");
        //需求2:得到set集合中年龄大于等于25的流,并把流中的数据收集到Set集合中并遍历
        Set<Integer> collect1 = h1.stream().filter(s -> s >= 25).collect(Collectors.toSet());
        for (Integer a : collect1) {
            System.out.println(a);
        }

        System.out.println("--------------------");

        String[] arr ={"林青霞,25","王祖贤,30","刘岩,50","棋棋,21","张无忌,85","张曼玉,23"};
        //需求3:得到字符串数组中姓名长度为3年龄大于28的流,并把流中的数据收集到Map集合中,姓名为键,年龄为值,遍历Map
        Stream<String> stringStream1 = Stream.of(arr).filter(s -> s.split(",")[0].length() == 3).filter(s -> Integer.parseInt(s.split(",")[1]) > 28);
        Map<String, Integer> map = stringStream1.collect(Collectors.toMap(s -> s.split(",")[0], s -> Integer.parseInt(s.split(",")[1])));
        Set<Map.Entry<String, Integer>> entries = map.entrySet();
        for (Map.Entry<String, Integer> a : entries) {
            System.out.println(a.getKey()+","+a.getValue());
        }
    }
}

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值