gongdear

gongdear的技术博客

欢迎大家参观我的博客
  menu
103 文章
89355 浏览
9 当前访客
ღゝ◡╹)ノ❤️

Lambda表达式几个示例

本示例根据Java8实战(Java 8 In Action)书中第五章末尾的练习题进行解读并扩展

/**

  • 类名称:Trader 交易员
  • 类描述:
  • 创建时间:2018年04月26日
  • @author gongdian
  • @version 1.0.0
    */public class Trader{
    private final String name;
    private final String city;
    private final Integer age;
    public Trader(String n, String c,Integer a){
    this.name = n;
    this.city = c;
    this.age = a;
    }
    public String getName(){
    return this.name;
    }
    public String getCity(){
    return this.city;
    }

public Integer getAge() {
return age;
}

public String toString(){
return "Trader:"+this.name + " in " + this.city;
}
}

/**

  • 类名称:Transaction 交易
  • 类描述:
  • 创建时间:2018年04月26日
  • @author gongdian
  • @version 1.0.0
    */public 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 this.trader;
    }
    public int getYear(){
    return this.year;
    }
    public int getValue(){
    return this.value;
    }
    public String toString(){
    return "{" + this.trader + ", " +
    "year: "+this.year+", " +
    "value:" + this.value +"}";
    }
    }

/**

  • 类名称:TraderMain
  • 类描述:
  • 创建时间:2018年04月26日
  • @author gongdian
  • @version 1.0.0
  • /* * (1) 找出2011年发生的所有交易,并按交易额排序(从低到高)。
  • (2) 交易员都在哪些不同的城市工作过?
  • (3) 查找所有来自于剑桥的交易员,并按姓名排序。
  • (4) 返回所有交易员的姓名字符串,按字母顺序排序。
  • (5) 有没有交易员是在米兰工作的?
  • (6) 打印生活在剑桥的交易员的所有交易额。
  • (7) 所有交易中,最高的交易额是多少?
  • (8) 找到交易额最小的交易。

*/public class TraderMain {
public static void main(String... args) {
Trader raoul = new Trader("Raoul", "Cambridge",35);
Trader mario = new Trader("Mario","Milan",36);
Trader alan = new Trader("Alan","Cambridge",28);
Trader brian = new Trader("Brian","Cambridge",36);
Trader gongdear = new Trader("Gongdear","Milan",28);
List transactions = Arrays.asList(
new Transaction(brian, 2011, 300),
new Transaction(raoul, 2012, 1000),
new Transaction(raoul, 2011, 1400),
new Transaction(mario, 2012, 710),
new Transaction(mario, 2012, 700),
new Transaction(alan, 2012, 950),
new Transaction(gongdear,2011,5800)
);
//(1) 找出2011年发生的所有交易,并按交易额排序(从低到高)。

List transactions2011 = transactions.stream()
.filter(transaction -> transaction.getYear()==2011)
.sorted(Comparator.comparing(Transaction::getValue))
.collect(toList());
System.out.println("(1) 找出2011年发生的所有交易,并按交易额排序(从低到高)。");
System.out.println(transactions2011);

//(2) 交易员都在哪些不同的城市工作过?
List transactionscity= transactions.stream().map(transaction -> transaction.getTrader().getCity())
.distinct().collect(toList());
System.out.println("(2) 交易员都在哪些不同的城市工作过?");
System.out.println(transactionscity);

//(3) 查找所有来自于剑桥的交易员,并按姓名排序。
List traderList =transactions.stream().map(transaction -> transaction.getTrader())
.distinct()
.filter(trader -> "Cambridge".equals(trader.getCity()))
.sorted(Comparator.comparing(Trader::getName)).collect(toList());
System.out.println("(3) 查找所有来自于剑桥的交易员,并按姓名排序。");
System.out.println(traderList);

//(4) 返回所有交易员的姓名字符串,按字母顺序排序。
String tradernameList = transactions.stream().map(transaction -> transaction.getTrader().getName())
.distinct()
//.sorted(String::compareTo)
.sorted()
.reduce("",(name1,name2)->name1+""+name2);
System.out.println("(4) 返回所有交易员的姓名字符串,按字母顺序排序。");
System.out.println(tradernameList);

//(5) 有没有交易员是在米兰工作的?
//方法1
// Boolean hasmilan=transactions.stream().map(transaction -> transaction.getTrader().getCity())
// .anyMatch((city)->city.equals("Milan"));
//方法2
Boolean hasmilan = transactions.stream()
.anyMatch(transaction -> transaction.getTrader()
.getCity()
.equals("Milan"));
System.out.println("(5) 有没有交易员是在米兰工作的?");
System.out.println(hasmilan);

//(6) 打印生活在剑桥的交易员的所有交易额。

//方法1 (装箱成本)
// Integer sum=transactions.stream().filter(transaction -> transaction.getTrader().getCity().equals("Cambridge"))
// .map(Transaction::getValue)
// .reduce(0,Integer::sum);
//方法2 (直接转为特化流-优化装箱成本)
Integer sum=transactions.stream().filter(transaction -> transaction.getTrader().getCity().equals("Cambridge"))
.mapToInt(Transaction::getValue)
.sum();
System.out.println("(6) 打印生活在剑桥的交易员的所有交易额。");
System.out.println(sum);

//(7) 所有交易中,最高的交易额是多少?
//方法1
//Optional max=transactions.stream().map(Transaction::getValue).max(Integer::compareTo); //方法2--
Optional max=transactions.stream().map(Transaction::getValue).reduce(Integer::max);
System.out.println("(7) 所有交易中,最高的交易额是多少?");
System.out.println(max);

//(8) 找到交易额最小的交易。
//方法1
Optional mintransaction=transactions.stream()
.min(Comparator.comparing(Transaction::getValue));
//方法2--
// Optional mintransaction=transactions.stream()
// .reduce((transaction, transaction2) -> transaction.getValue()
System.out.println("(8) 找到交易额最小的交易。");
System.out.println(mintransaction);

// 求所有交易金额的平均值

OptionalDouble avge=transactions.stream().map(transaction -> transaction.getValue())
.mapToInt(Integer::intValue)
.average();
System.out.println("求所有交易金额的平均值");
System.out.println(avge);

// 求所有交易员的个数
//方法1
// Optional counttranc=transactions.stream().map(transaction -> transaction.getTrader().getName())
// .distinct()
// .map(s -> 1)
// .reduce((integer, integer2) -> integer+integer2);
//方法2
Long counttranc=transactions.stream().map(transaction -> transaction.getTrader().getName())
.distinct()
.count();
System.out.println("求所有交易员的个数");
System.out.println(counttranc);

//求所有交易员的平均年龄

OptionalDouble average = transactions.stream().map(transaction -> transaction.getTrader().getAge())
.mapToInt(Integer::intValue).average();
System.out.println("求所有交易员的平均年龄");
System.out.println(average);

//求年龄相同的交易员
Map<Integer, List> agetrader=transactions.stream()
.map(transaction -> transaction.getTrader())
.distinct()
.collect(groupingBy(Trader::getAge));
System.out.println("求年龄相同的交易员");
System.out.println(agetrader);

//求生活在米兰的交易员的平均年龄
OptionalDouble milanaverage=transactions.stream()
.map(transaction -> transaction.getTrader())
.filter(trader -> trader.getCity().equals("Milan"))
.distinct()
.mapToInt(trader -> trader.getAge())
.average();
System.out.println("求生活在米兰的交易员的平均年龄");
System.out.println(milanaverage);

//求交易金额大于1000的交易员的平均年龄
OptionalDouble trader1000average=transactions.stream()
.filter(transaction -> transaction.getValue() > 1000)
.mapToInt(transaction -> transaction.getTrader().getAge())
.average();
System.out.println("求交易金额大于1000的交易员的平均年龄");
System.out.println(trader1000average);

//求年龄小于30的交易员的平均交易金额
OptionalDouble age30trans=transactions.stream()
.filter(transaction -> transaction.getTrader().getAge()<30)
.mapToInt(transaction->transaction.getValue())
.average();
System.out.println("求年龄小于30的交易员的平均交易金额");
System.out.println(age30trans);

}
}

宝剑锋从磨砺出,梅花香自苦寒来.