java Lambda表达式练习

关于JAVA8新特性,Lambda表达式的练习。

java8更新许久,但从来没有试验整理过。借公司空闲之际,练习一下Lambda表达式!

练习题目,均为网上寻找题目(原版地址找不到了)。

本文lambda学习主要参考博主葵花下的獾的文章,参考链接https://blog.csdn.net/qq_28410283/article/details/80634725(非常有用,lambda其他知识在文章下方均有链接)

基本用法:
        list.stream()
                .map(s -> s + 1)  //映射
                .flatMap(s -> Stream.of(s)) //和map差不多,但返回类型为Stream,类似list.add()和list.addAll()的区别
                .filter(s -> s < 1000)    //过滤
                .limit(5)   //限制
                .skip(1)    //跳过
                .distinct() //去重
                .sorted()   //自然排序
                .sorted(Integer::compareTo) //自定义排序
                .reduce()   //对需要的值进行加工,一般方法有(max,min等)参考链接https://blog.csdn.net/zhang89xiao/article/details/77164866

准备类(交易数据的分析),

package pojo1;

/**
*定义一个交易人员的类,添加必要属性(名字和城市)
*/

public  class Trader{

    private String name;
    private String city;

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

    public String getName(){
        return this.name;
    }

    public String getCity(){
        return this.city;
    }

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

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

/**
*添加交易过程的类,添加属性(交易员,年限,交易额)
*
*/

public class Transaction{

    private Trader trader;
    private int year;
    private 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 +"}";
    }
}

添加数据

        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)
        );

开始练习:

1.找出2011年发生的所有交易,并按交易额排序

思路:条件:年限为2011,需要排序。所有的集合用List存储。

List<Transaction> tr2001 = transaction.stream

                             .filter(transaction -> transaction.getYear() == 2011)    //筛选符合条件的

                             .sorted(comparing(Transaction::getValue))  //根据交易额排序

                             .collect(toList());        //集合

 

2.交易员在哪些不同的城市工作过

思路:结果为城市的集合

List<String> cityList = transaction.stream

                   .map(transaction -> transaction.getTrader().getCity())                  //取出所有的城市

                   .distinct()                            //去重

                   .collect(toList());                  //集合

 

3.查找所有来自剑桥的交易员,并按姓名进行排序!

思路:条件:城市为剑桥。结果:所有的交易员(集合)。进行排序。

List<Trader>  names = transactions.stream

                     .map(Transaction::Trader)                   //先取出所有的交易员

                     .filter(trader -> trader.getCity().equals("Cambridge"))       //条件:城市为剑桥

                     .distinct()           //去重

                     .sorted(comparing(Trader::getName))                 //根据名字排序

                    .collect(toList());                   //集合

 

4.返回所有交易员的姓名的字符串,并按字母顺序排序。

思路:结果:所有交易员的姓名(String),进行排序。

String traderNames = transaction.stream()

                              .map(transaction -> transaction.getTrader().getName())     //得到所有交易员的名字

                             .distinct()              //去重

                             .sorted()                //默认排序

                            .reduce("",(n1,n2) -> n1+n2+";");       //将字符串进行拼接(方法内一个参数为第一个默认字符串,不设置的话    //                     n1一般为第一个默认字符串。-> 后为操作)

 

5.有没有交易员在米兰工作的

思路:结果:Boolean。条件:城市为米兰的交易员

Boolean milanTrader = transaction.stream

                                .anyMatch(transaction ->trasaction.getTrader().getCity().equals("milan"))

/**Predicate的函数式接口,接口定义请看《JAVA8 Predicate接口》

*anyMatch表示,判断的条件里,任意一个元素成功,返回true

*allMatch表示,判断条件里的元素,所有的都是,返回true

*noneMatch跟allMatch相反,判断条件里的元素,所有的都不是,返回true*/

 

6.打印生活在剑桥的交易员的所有交易额

思路:条件:生活在剑桥。结果:交易额

transaction.stream().filter(transaction -> transaction.getTrader().getCity().equals("Cambridge"))

                 .forEach(transaction -> System.out.println(transcation.getValue()));

 

7.所有交易中,最高的交易额是多少?

Optional<Integer> maxValue = transaction.stream

                             .map(Transaction::getValue)

                            .distinct()

                            .reduce(Interger::max);
注:可以用maxValue.isPresent()判断交易额是否存在。

 

8.找到交易额最小的交易

  • 写法1(使用自带的min方法)

Optional<Integer> minValue = transaction.stream()

                            .map(Trasaction::getValue)

                            .distinct()

                            .reduce(Integer::min);

  • 写法2(比较交易额,拿到最小的)

Optional<Integer> minValue = transaction.stream()

                            .map(Trasaction::getValue)

                            .distinct()

                            .reduce((t1,t2)->{

                             if(t1.intValue() > t2.intValue()) return t2.intValue();

                             else  return t1.intValue();

                            });

 

综上,八个方法练习。

 

 

 

  • 3
    点赞
  • 13
    收藏
    觉得还不错? 一键收藏
  • 3
    评论
Java lambda表达式习题可以通过使用Lambda表达式和方法引用来改写给定的代码,以实现相同的效果。 第一个习题是关于使用Lambda表达式实现多线程。原来的代码中使用了匿名内部类来实现Runnable接口,可以改写成使用Lambda表达式的形式: ``` new Thread(() -> System.out.println("do something...")).start(); ``` 这里使用了Lambda表达式替代了匿名内部类,使得代码更简洁。 第二个习题是关于构造方法引用。原来的代码中使用了lambda表达式来创建一个新的字符串对象,可以改写成使用构造方法引用的形式: ``` String::new ``` 这里使用了构造方法引用的语法形式,等价于lambda表达式`() -> new String()`,都是用来创建一个新的字符串对象。 第三个习题是关于静态方法引用。原来的代码中使用了匿名内部类来调用静态方法,可以改写成使用静态方法引用的形式: ``` String::valueOf ``` 这里使用了静态方法引用的语法形式,等价于lambda表达式`(s) -> String.valueOf(s)`,都是用来调用String类的静态valueOf方法。 因此,以上是关于Java lambda表达式习题的改写方法,可以使用Lambda表达式和方法引用来简化代码,并实现相同的效果。<span class="em">1</span><span class="em">2</span><span class="em">3</span> #### 引用[.reference_title] - *1* *2* *3* [Java Lanmbda表达式练习题](https://blog.csdn.net/weixin_41712089/article/details/103036993)[target="_blank" data-report-click={"spm":"1018.2226.3001.9630","extra":{"utm_source":"vip_chatgpt_common_search_pc_result","utm_medium":"distribute.pc_search_result.none-task-cask-2~all~insert_cask~default-1-null.142^v93^chatsearchT3_1"}}] [.reference_item style="max-width: 100%"] [ .reference_list ]
评论 3
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值