黑猴子的家:Java 8 -> 阶段性练习一

1、练习题一

调用Collections.sort()方法,通过定制排序,比较两个Employee(先按年龄比,年龄相同按姓名比),使用Lambda表达式作为参数传递。

package com.yinggu.demo4;
import java.util.Collections;
import java.util.Comparator;
import java.util.List;
import org.junit.Test;
import com.yinggu.data.EmployeeData;
import com.yinggu.domain.Employee;

 * @author 黑猴子的家
 * https://www.jianshu.com/u/37fd8e2dff4c

public class TestLambda1 {     

   调用Collections.sort()方法
   通过定制排序比较两个Employee
   (先按年龄比年龄相同按姓名比)
   使用Lambda表达式作为参数传递

      @Test
      public void test1() {
            List<Employee> list = EmployeeData.getData();
            Collections.sort(list, new Comparator<Employee>() {
                  @Override
                  public int compare(Employee o1, Employee o2) {
                        int com = o1.getAge() - o2.getAge();
                        if (com > 0) {
                              return 1;
                        } else if (com < 0) {
                              return -1;
                        }
                        return o1.getName().compareTo(o2.getName());
                  }
            });
            System.out.println(list);
            System.out.println("---------------------");
            Collections.sort(list, (o1, o2) -> { 
                        int com = o1.getAge() - o2.getAge();
                        if (com > 0) {
                              return 1;
                        } else if (com < 0) {
                              return -1;
                        }
                        return o1.getName().compareTo(o2.getName()); 
            });
            System.out.println(list);
      }
}

2、练习题二

(1)声明函数式接口,接口中声明抽象方法:public String getValue(String str);
(2)声明类LambdaTest,类中编写方法使用接口作为参数,将一个字符串转换成大写,并作为方法的返回值。
(3)再将一个字符串的第2个到第4个索引位置进行截取子串。

package com.yinggu.demo4;

import java.util.Collections;
import java.util.Comparator;
import java.util.List;
import org.junit.Test;
import com.yinggu.data.EmployeeData;
import com.yinggu.domain.Employee;

@FunctionalInterface
interface ValueInterface {
      String getValue(String str);
}

 * @author 黑猴子的家
 * http://www.121ugrow.com/

public class TestLambda1 {

      @Test
      public void test2() {
            // 将一个字符串转换成大写,并作为方法的返回值。
            method("hello", str -> str.toUpperCase());
            // 一个字符串的第2个到第4个索引位置进行截取子串。
            method("我爱你北京", str -> str.substring(1, 4)); 
      }
      
      public void method(String str, ValueInterface vi) {
            System.out.println(vi.getValue(str));
      }
}

3、练习题三

(1)声明一个带两个泛型的函数式接口,泛型类型为<T,R> : T 为参数,R 为返回值。
(2)接口中声明对应抽象方法
(3)在LambdaTest类中声明方法,使用接口作为参数,计算两个long型参数的和。
(4)再计算两个long型参数的乘积

package com.yinggu.demo4;

import java.util.Collections;
import java.util.Comparator;
import java.util.List;
import org.junit.Test;
import com.yinggu.data.EmployeeData;
import com.yinggu.domain.Employee;

@FunctionalInterface
interface CaleInterface<T, R> {
      R cale(T t1, T t2);
}

 * @author 黑猴子的家
 * http://www.121ugrow.com/

public class TestLambda1 {

      public void method2(Long l1, Long l2, CaleInterface<Long, Double> ci) {
            System.out.println(ci.cale(l1, l2));
      }

      @Test
      public void test3() {
            // 1.计算两个long型参数的和。
            method2(10L, 20L, (l1, l2) -> (double) (l1 + l2));
            
            // 2.计算两个long型参数的乘积
            method2(10L, 20L, (l1, l2) -> (double) (l1 * l2));
      }
}

4、练习题四

创建Book类,里面有书名、作者、价格属性,并对其进行合理封装 定义测试类,提供测试方法(要求用上Lambda表达式)
测试方法一:比较两本书大小,先判断价格,价格相等,判断书名

(1)book类

package com.yinggu.domain;

/**
 * @author 黑猴子的家
 * http://www.121ugrow.com/
 */
public class Book {
      
      private String name;
      private String author;
      private double price;

      public Book() {
            super();
      }

      public Book(String name, String author, double price) {
            super();
            this.name = name;
            this.author = author;
            this.price = price;
      }

      public String getName() {
            return name;
      }

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

      public String getAuthor() {
            return author;
      }

      public void setAuthor(String author) {
            this.author = author;
      }

      public double getPrice() {
            return price;
      }

      public void setPrice(double price) {
            this.price = price;
      }
      
      @Override
      public String toString() {
            return "Book [name=" + name + ", author=" + author + ", price=" + price + "]";
      }
}

(2)code

package com.yinggu.demo4;
import java.util.function.BiPredicate;
import java.util.function.Function;
import org.junit.Test;
import com.yinggu.domain.Book;

* @author 黑猴子的家
 * https://www.jianshu.com/u/37fd8e2dff4c

interface MyCompare<T> {
      int compare(T t1, T t2);
}
public class TestLambda2 {
      @Test
      public void test1() {
            Book b1 = new Book("红楼梦", "曹雪芹", 100);
            Book b2 = new Book("西游记", "吴承恩", 23);
            compareBook(b1, b2, (o1, o2) -> {
                  if (o1.getPrice() > o2.getPrice())
                        return 1;
                  else if (o1.getPrice() < o2.getPrice())
                        return -1;
                  else
                        return o1.getName().compareTo(o2.getName());
            });
      }
      public void compareBook(Book b1, Book b2, MyCompare<Book> com) {
            System.out.println(com.compare(b1, b2));
      }
}

5、练习题五

书名、作者、价格一样,则为两本书相等

package com.yinggu.demo4;
import java.util.function.BiPredicate;
import java.util.function.Function;
import org.junit.Test;
import com.yinggu.domain.Book;

 * @author 黑猴子的家
 * https://www.jianshu.com/u/37fd8e2dff4c

public class TestLambda2 {
      @SuppressWarnings("unused")
      @Test
      public void test2() {
            Book b1 = new Book("红楼梦", "曹雪芹", 100);
            // Book b2 = new Book("西游记","吴承恩",23);
            Book b2 = new Book("红楼梦", "曹雪芹", 100);
            BiPredicate<Book, Book> pre = new BiPredicate<Book, Book>() {
                  @Override
                  public boolean test(Book t, Book u) {
                        return t.getAuthor().equals(u.getAuthor()) &&
                                    t.getName().equals(u.getName())
                                    && t.getPrice() == u.getPrice();
                  }
            };
            System.out.println("-------------------------------");
            BiPredicate<Book, Book> pre1 = (t, u) -> 
                        t.getAuthor().equals(u.getAuthor()) &&
                        t.getName().equals(u.getName())
                        && t.getPrice() == u.getPrice();
            System.out.println(pre1.test(b1, b2));
      }
}

6、练习题六

根据传入的Book对象,打印有效的格式 这本书叫x,作者是xx,价格为xx.

package com.yinggu.demo4;
import java.util.function.BiPredicate;
import java.util.function.Function;
import org.junit.Test;
import com.yinggu.domain.Book;
public class TestLambda2 {
      @Test
      public void test3() {
            Function<Book, String> fun = b -> "这本书:" + b.getName() 
                        + ",作者是:" + b.getAuthor() 
                        + ",价格为:" + b.getPrice();
            Book b1 = new Book("红楼梦", "曹雪芹", 100);
            System.out.println(fun.apply(b1));
      }
}
  • 0
    点赞
  • 1
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值