java8实战关于Stream的一篇测试题

package java8..筛序苹果;

import java.util.*;
import java.util.function.Predicate;
import java.util.stream.Collectors;

/**
 * @program: javaCodeThink
 * @description:
 * @author: fbl
 * @create: 2020-10-29 08:37
 **/
public class FlatMap {

    public static void main(String[] args) {
        String[] words = {"Hello", "World"};

        // flatMap
        List<String> collect = Arrays.stream(words).map(w -> w.split("")).flatMap(Arrays::stream).distinct().collect(Collectors.toList());

        //collect.forEach(System.out::print);


        // 复合谓词
        Predicate<String> p = w -> w.equals("H");
        Predicate<String> b = p.or(w -> w.equals("W"));

        List<String> collect1 = Arrays.stream(words).map(w -> w.split("")).flatMap(Arrays::stream).filter(b.negate()).collect(Collectors.toList());
        //collect1.forEach(System.out::print);
        Integer[] n1 = {1, 2, 3};
        Integer[] n2 = {3, 4};
        Arrays.stream(n1).flatMap(nn1 -> Arrays.stream(n2).map(nn2 -> new int[]{nn1, nn2}));

        Trader raoul = new Trader("Raoul", "Cambridge");
        Trader mario = new Trader("Mario", "Milan");
        Trader alan = new Trader("Alan", "Cambridge");
        Trader brian = new Trader("Brian", "Cambridge");

        List<Transaction> transactions = Arrays.asList(new Transaction(brian, 2011, 300), new Transaction(raoul, 2012, 1000), new Transaction(raoul, 2011, 400),
                new Transaction(mario, 2012, 710), new Transaction(mario, 2012, 700), new Transaction(alan, 2012, 950));

        // 找出2011年发生的所有交易,并按交易额排序(从低到高)
        List<Transaction> collect2 = transactions.stream().filter(t -> t.getYear() == 2011).sorted(Comparator.comparing(Transaction::getValue)).collect(Collectors.toList());
        for (Transaction transaction : collect2) {
            System.out.println(transaction.toString());
        }
        System.out.println("-------------------------------------------------");
        // 交易员都在哪些不同的城市工作过?
        List<String> collect3 = transactions.stream().map(t -> t.getTrader().getCity()).distinct().collect(Collectors.toList());
        for (String s : collect3) {
            System.out.println(s);
        }
        System.out.println("-------------------------------------------------");
        // 查找所有来自剑桥的交易员,并按照姓名排序
        List<Trader> cambridge2 = transactions.stream().filter(t -> t.getTrader().getCity().equals("Cambridge")).map(n -> n.getTrader()).distinct().sorted(Comparator.comparing(t -> t.getName())).collect(Collectors.toList());
        for (Trader s : cambridge2) {
            System.out.println(s);
        }
        System.out.println("-------------------------------------------------");
        // 返回所有交易员的姓名字符串,按字母顺序排序 第一种效率更高,第二种使用字符串拼接的形式,会使用StringBuilder
        String collect4 = transactions.stream().map(t -> t.getTrader().getName()).distinct().sorted(String::compareTo).collect(Collectors.joining());
        String collect5 = transactions.stream().map(t -> t.getTrader().getName()).distinct().sorted(String::compareTo).reduce("",(m,n) -> m + n);
        System.out.println(collect4);
        System.out.println(collect5);
        System.out.println("-------------------------------------------------");
        // 有没有交易员在米兰生活的?
        boolean cambridge = transactions.stream().anyMatch(t -> t.getTrader().getCity().equals("Cambridge"));
        System.out.println(cambridge);
        System.out.println("-------------------------------------------------");
        // 打印生活在剑桥的交易员的所有交易额
          transactions.stream().filter(t -> t.getTrader().getCity().equals("Cambridge")).map(Transaction::getValue).forEach(System.out::println);
       // 所有交易中,最高的交易是多少 第二种效率更高(不用拆装箱)  第三种存储有最大 最小 平均 统计总量 总计 等,要哪个get那个即可
        System.out.println("-------------------------------------------------");
        Optional<Integer> reduce = transactions.stream().map(t -> t.getValue()).reduce(Integer::max);
        OptionalInt max = transactions.stream().mapToInt(t -> t.getValue()).max();
        int summaryMax = transactions.stream().collect(Collectors.summarizingInt(Transaction::getValue)).getMax();
        System.out.println(reduce.get());
        System.out.println(max.getAsInt());
        System.out.println(summaryMax);
        System.out.println("-------------------------------------------------");
        // 找到交易额最小的交易 第一种自己写的,还是有命令式编程的样子 第二种是第三种的简化版
         List<Transaction> collect6 = transactions.stream().sorted(Comparator.comparing(Transaction::getValue)).limit(1).collect(Collectors.toList());
        Optional<Transaction> collect7 = transactions.stream().min(Comparator.comparing(Transaction::getValue));
        Optional<Transaction> collect8 = transactions.stream().collect(Collectors.minBy(Comparator.comparing(Transaction::getValue)));
        System.out.println(collect6);
        System.out.println(collect7);
        System.out.println(collect8);

   System.out.println("-------------------------------------------------");
        // 交易员按照城市分组
        Map<String, List<Trader>> collect9 = transactions.stream().map(Transaction::getTrader).distinct().collect(Collectors.groupingBy(Trader::getCity));
        System.out.println(collect9);
    }

}


class Trader {
    private final String name;
    private final String city;

    public Trader(String n, String c) {
        this.name = n;
        this.city = c;
    }

    public String getName() {
        return name;
    }

    public String getCity() {
        return city;
    }

    @Override
    public String toString() {
        return "Trader{" +
                "name='" + name + '\'' +
                ", city='" + city + '\'' +
                '}';
    }
}

class Transaction {
    private final Trader trader;
    private final int year;
    private final int value;

    public Transaction(Trader trader, int year, int value) {
        this.trader = trader;
        this.year = year;
        this.value = value;
    }

    public Trader getTrader() {
        return trader;
    }

    public int getYear() {
        return year;
    }

    public int getValue() {
        return value;
    }

    @Override
    public String toString() {
        return "Transaction{" +
                "trader=" + trader +
                ", year=" + year +
                ", value=" + value +
                '}';
    }
}


评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值