JAVA_Stream_练习

package airycode_java8.nice7;

import airycode_java8.nice1.Employee;
import org.junit.Test;

import java.util.Arrays;
import java.util.List;
import java.util.Optional;
import java.util.stream.Collectors;

/**
 * Created by admin on 2019/1/3.
 */
public class TestStramAPI {

    /***
     * 1.给定一个数字列表,如何返回一个由每一个数字的平方构成的列表,给定【1,2,3,4,5】返回[1,4,9,16,25]
     */
    @Test
    public void test1(){
        List<Integer> list = Arrays.asList(1,2,3,4,5);
        List<Integer> collect = list.stream().map((x) -> x * x).collect(Collectors.toList());
        collect.forEach(System.out::println);
    }

    /***
     * 2.用map和reduce方法数数流中有多少个emplloyee
     *
     */
    //准备数据
    static List<Employee> employeeList = Arrays.asList(
            new Employee("张三",18,9999.99, Employee.Status.FREE),
            new Employee("李四",38,5555.55,Employee.Status.BUSY),
            new Employee("王五",50,6666.66,Employee.Status.VOCATION),
            new Employee("赵六",16,3333.33,Employee.Status.FREE),
            new Employee("田七",8,7777.77,Employee.Status.BUSY)

    );
    @Test
    public void test2(){
        Optional<Integer> sum = employeeList.stream().map((e) -> 1).reduce(Integer::sum);
        System.out.println(sum.get());
    }


}

  交易员和交易练习:

package airycode_java8.nice7;

/**
 * 交易员对象
 * Created by admin on 2019/1/3.
 */
public class Trader {

    private String name;
    private String city;

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

    public String getName() {
        return name;
    }

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

    public String getCity() {
        return city;
    }

    public void setCity(String city) {
        this.city = city;
    }

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


package airycode_java8.nice7;

/**
 * 交易对象
 * Created by admin on 2019/1/3.
 */
public class Transaction {

    private Trader trader;
    private int year;
    private int value;
    private String currency;

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

    public Trader getTrader(){
        return trader;
    }
    public int getYear(){
        return year;
    }
    public int getValue(){
        return value;
    }
    public String getCurrency(){
        return currency;
    }

    @Override
    public String toString(){
        return "i am transaction : my trader is : "
                + trader.getName()
                + " ; my year is : "
                + year
                + " ; my value is : "
                + value
                + " ; my currency is : "
                + currency;
    }
}


package airycode_java8.nice7;

import org.junit.Before;
import org.junit.Test;

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

import static java.util.Comparator.comparingInt;
import static java.util.stream.Collectors.*;
/**
 * Created by admin on 2019/1/3.
 */
public class TraderExercise {

    List<Trader> traders = new LinkedList<>();
    List<Transaction> transactions = new LinkedList<>();

    @Before
    public void init(){

        Trader t1 = new Trader("trader1","剑桥");
        Trader t2 = new Trader("trader2","米兰");
        Trader t3 = new Trader("trader3","剑桥");
        Trader t4 = new Trader("trader4","剑桥");
        traders.addAll(Arrays.asList(t1,t2,t3,t4));

        Transaction tran1 = new Transaction(t4,2011,300,"$");
        Transaction tran2 = new Transaction(t1,2012,1000,"$");
        Transaction tran3 = new Transaction(t1,2011,400,"¥");
        Transaction tran4 = new Transaction(t2,2012,710,"¥");
        Transaction tran5 = new Transaction(t2,2012,700,"$");
        Transaction tran6 = new Transaction(t3,2012,950,"¥");
        transactions.addAll(Arrays.asList(tran1,tran2,tran3,tran4,tran5,tran6));
    }

    /***
     * 1.2011年的所有交易并按照金额由小到大排序
     */
    @Test
    public void test1(){
        transactions.stream()
                .filter((t)->t.getYear() == 2011)
                .sorted((t1,t2)->Integer.compare(t1.getValue(),t2.getValue()))
                .forEach(System.out::println);
    }

    /***
     *2.交易员都在哪些不同的城市生活
     */
    @Test
    public void test2(){

        traders.stream()
                .map(Trader::getCity)
                .distinct()
                .forEach(System.out::println);

    }

    /***
     *3.查找所有来自剑桥的交易员,并按姓名排序
     */
    @Test
    public void test3(){

//        traders.stream()
//                .filter((t)->"剑桥".equals(t.getCity()))
//                .sorted((e1,e2)->e1.getName().compareTo(e2.getName()))
//                .forEach(System.out::println);
        traders.stream()
                .filter((t)->"剑桥".equals(t.getCity()))
                .sorted(Comparator.comparing(Trader::getName))
                .forEach(System.out::println);

    }

    /***
     *4.查询所有交易员的姓名字符串,并按字母排序
     */
    @Test
    public void test4(){

        traders.stream()
                .filter((t)->"剑桥".equals(t.getCity()))
                .sorted(Comparator.comparing(Trader::getName))
                .forEach(System.out::println);

    }

    /***
     *5.有没有交易员在米兰
     */
    @Test
    public void test5(){

        boolean any = traders.stream()
                .filter((t) -> "米兰".equals(t.getCity()))
                .findAny()
                .isPresent();
        System.out.println(any);

    }

    /***
     * 6.打印在剑桥生活的交易员的所有交易金额
     */
    @Test
    public void test6(){

        Integer sum = transactions.stream()
                .filter(tran -> "剑桥".equals(tran.getTrader().getCity()))
                .map(Transaction::getValue)
                .reduce(0, (val1, val2) -> val1 + val2);
        System.out.println(sum);

    }

    /***
     * 7.所有交易中,最高的交易额是多少
     */
    @Test
    public void test7(){
        transactions.stream()
                .sorted(Comparator.comparing(Transaction::getValue).reversed())
                .findFirst()
                .ifPresent(System.out::println);

        transactions.stream()
                .map(Transaction::getValue)
                .reduce(Integer::max)
                .ifPresent(System.out::println);
    }

    /***
     * 8.找到交易额中最小的金额
     */
    @Test
    public void test8(){
        transactions.stream()
                .map(Transaction::getValue)
                .reduce(Integer::min)
                .ifPresent(System.out::println);

        transactions.stream()
                .min(Comparator.comparing(Transaction::getValue))
                .ifPresent(System.out::println);

        transactions.stream()
                .min(Comparator.comparing((Transaction t1) -> t1.getValue()))
                .ifPresent(System.out :: println);

    }

    /***
     * 9.统计每个交易员的记录
     */
    @Test
    public void test9(){
        transactions.stream()
                .collect(groupingBy(Transaction::getTrader))
                .entrySet().stream()
                .forEach(System.out::println);

    }


    /***
     * 10.找到单笔交易最高的交易员
     */
    @Test
    public void test10(){
        transactions.stream()
                .max(Comparator.comparing(Transaction::getValue))
                .ifPresent(tran->{
                    System.out.println(tran.getTrader());
                });
    }

    /***
     * 11.统计交易总额最高的交易员(排序)
     */
    @Test
    public void test11(){
        transactions.stream().collect(groupingBy(Transaction::getTrader))
                .entrySet().stream().map(t->{
            Map<String,Object> result = new HashMap<>();
            int sum = t.getValue().stream().mapToInt(Transaction :: getValue).sum();
            result.put("sum",sum);
            result.put("trader",t.getKey());
            return result;

        }).sorted(comparingInt((Map m) -> (int)m.get("sum")).reversed()).findFirst().ifPresent(System.out::println);
    }


    /***
     * 12.使用方法引用对transaction排序
     */
    @Test
    public void test12(){
        transactions.stream().sorted(Comparator.comparing(Transaction::getValue)).forEach(System.out::println);

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

        //声明接口的实现方式
        Function<Transaction,Integer> function = Transaction :: getValue;
        Transaction[] transactionsArray = new Transaction[transactions.size()];
        Arrays.sort(transactions.toArray(transactionsArray),Comparator.comparing(function));
        Arrays.asList(transactionsArray).stream().forEach(System.out :: println);
    }


    /***
     * 13.根据trader(对象)将transaction分组
     */
    @Test
    public void test13(){
        transactions.stream()
                .collect(groupingBy(Transaction :: getTrader))
                .entrySet().stream()
                .forEach(System.out :: println);
    }

    //【14.根据货币(字符串)类型分组
    @Test
    public void exercise14(){
        transactions.stream()
                .collect(groupingBy(Transaction :: getCurrency))
                .entrySet().stream()
                .forEach(System.out :: println);
    }
    //【15.获取交易总金额
    @Test
    public void exercise15(){
        int sum1 = transactions.stream().mapToInt(Transaction::getValue).sum();
        System.out.println("通过map转换求和sum1 = " + sum1);
        int sum2 = transactions.stream().collect(Collectors.summingInt(Transaction::getValue));
        System.out.println("通过collect汇总求和sum2 = " + sum2);
        //规约操作都需要使用map将对象映射为返回值的类型
        int sum3 = transactions.stream().map(Transaction::getValue).reduce(0,(t1,t2) -> t1 + t2);
        System.out.println("通过reduce规约求和sum3 = " + sum3);
    }
    //【16.二级分类,先按照交易员分类,然后交易金额大于800归为high,低于800归为low
    @Test
    public void exercise16(){
        transactions.stream()
                .collect(groupingBy(Transaction :: getTrader,groupingBy(t -> {
                    if(t.getValue()< 800 ){
                        return "low";
                    }else {
                        return "heigh";
                    }
                })))
                .entrySet().stream()
                .forEach(System.out :: println);
    }
    //【17.获取每个交易员,交易最大的一笔
    @Test
    public void exercise17(){
        transactions.stream()
                .collect(groupingBy(Transaction::getTrader,maxBy(Comparator.comparingInt(Transaction::getValue))))
                .entrySet().stream()
                .distinct()
                .sorted(Comparator.comparing((Map.Entry m) -> {
                    Trader t = (Trader) m.getKey();
                    return t.getName();
                }))
                .forEach(System.out :: println);
    }






































}

  

猜你喜欢

转载自www.cnblogs.com/airycode/p/10231665.html