Java 8里的Predicate学习笔记

简介: Java 8里的Predicate学习笔记

测试代码:

MapTest maptest = new MapTest();
    List<Country> testdata = maptest.getCountry();
    Map<String, Country> result1 = maptest.getCountryDataMap(testdata);
    Map<String, Country> result2 = maptest.getCountryDataMap2(testdata);
    Stream<Country> temp = testdata.stream();
    Predicate<Country> match = country -> country.getCode().equals("US"); 
    Stream<Country> result = temp.filter(match);
    System.out.println("Size 2: " + result.count());
    List<Country> filterResult = testdata.stream().filter((country) -> country.getCode().equals("US")).collect(Collectors.toList());
    System.out.println("size: " + filterResult.size());
    filterResult.forEach(System.out::println);
    System.out.println(maptest.assertEqual2(result1, result2));

image.pngPredicate的源代码:

/**
 * Represents a predicate (boolean-valued function) of one argument.
 *
 * <p>This is a <a href="package-summary.html">functional interface</a>
 * whose functional method is {@link #test(Object)}.
 *
 * @param <T> the type of the input to the predicate
 *
 * @since 1.8
 */

image.pngPredicate接受一个类型作为参数,返回布尔值。


因此代码里我就可以使用第113行这种箭头函数,country为箭头函数或者说Lambda Function里的形式参数(输入参数),因为Predicate接收的泛型参数为T- Country,所以编译器能断定,形式参数的类型一定为Country.

image.png


最后用collect,传入Collectors.toList().

collect方法将传入的Collector施加到stream的元素内,image.pngimage.png

package java8.forHybrisCodeReview;
import java.util.ArrayList;
import java.util.HashMap;
import java.util.List;
import java.util.Map;
import java.util.function.Consumer;
import java.util.function.Predicate;
import java.util.stream.Collectors;
import java.util.stream.Stream;
class Country{
  private String mCountryCode;
  private int mRank;
  public Country(String mCode, int rank){
    this.mCountryCode = mCode;
    this.mRank = rank;
  }
  public String getCode(){
    return this.mCountryCode;
  }
  @Override
    public boolean equals(Object other) {
        if( other == null)
          return false;
        if ( !(other instanceof Country) )
          return false;
        Country country = (Country)other;
        return this.mCountryCode.equals(country.mCountryCode) && this.mRank == country.mRank;
    }
  @Override
    public int hashCode() {
        return this.mCountryCode.hashCode()*37 + this.mRank;
    }
}
public class MapTest{
  public List<Country> getCountry(){
    List<Country> countries = new ArrayList<Country>();
    Country country = new Country("ZH", 1);
    countries.add(country);
    country = new Country("US", 2);
    countries.add(country);
    country = new Country("JP", 3);
    countries.add(country);
    return countries;
  }
  public Map<String, Country> getCountryDataMap(List<Country> countryList)
  {
    final Map<String, Country> countryDataMap = new HashMap<>();
    for (final Country countryData : countryList){
      countryDataMap.put(countryData.getCode(), countryData);
    }
    return countryDataMap;
  }
  public Map<String, Country> getCountryDataMap2(List<Country> countryList)
  {
    final Map<String, Country> countryDataMap = new HashMap<>();
    Consumer<Country> consumer = c -> countryDataMap.put(c.getCode(), c);
    countryList.forEach(consumer);
    return countryDataMap;
  }
  // forEach之所以被称为内部遍历器,原因在于一旦它开始执行了,那么遍历操作就不能够被轻易中断。
  public boolean assertEqual(Map<String, Country> map1, Map<String, Country> map2){
    if( map1.size() != map2.size())
      return false;
    final boolean equal = true;
    map1.forEach((key, value)->
    {
      System.out.println("key of map1:" + key);
      Country country = map2.get(key);
      if( !value.equals(country)){
      }
        // Void methods cannot return a value
        // return false;
        // equal = false; // cannot change final
    });
    return equal;
  }
  public boolean assertEqual2(Map<String, Country> map1, Map<String, Country> map2){
    if( map1.size() != map2.size())
      return false;
    for (Map.Entry<String,Country> entry : map1.entrySet()) {
        String key = entry.getKey();
        Country country = entry.getValue();
        Country country2 = map2.get(key);
        if( !country.equals(country2))
          return false;
    }
    return true;
    }
  public static void main(String[] arg){
    MapTest maptest = new MapTest();
    List<Country> testdata = maptest.getCountry();
    Map<String, Country> result1 = maptest.getCountryDataMap(testdata);
    Map<String, Country> result2 = maptest.getCountryDataMap2(testdata);
    Stream<Country> temp = testdata.stream();
    Predicate<Country> match = country -> country.getCode().equals("US"); 
    Stream<Country> result = temp.filter(match);
    System.out.println("Size 2: " + result.count());
    List<Country> filterResult = testdata.stream().filter((country) -> country.getCode().equals("US")).collect(Collectors.toList());
    System.out.println("size: " + filterResult.size());
    filterResult.forEach(System.out::println);
    System.out.println(maptest.assertEqual2(result1, result2));
  }
}


相关文章
|
5月前
|
Java 编译器 开发工具
Java基础学习笔记——idea篇
JDK由JRE(包含JVM和核心类库)和开发工具箱(如javac编译器和java运行工具)组成。Java项目结构包括Project、Module、Package和Class。IDEA快捷键包括:生成main方法(main psvm)、复制代码(Ctrl+D)、删除代码(Ctrl+Y/X)、格式化代码(Ctrl+Alt+L)、重命名(Shift+F6)等。
45 0
|
5月前
|
监控 负载均衡 Dubbo
|
2月前
|
存储 Java
Java学习笔记 List集合的定义、集合的遍历、迭代器的使用
Java学习笔记 List集合的定义、集合的遍历、迭代器的使用
|
22天前
|
存储 安全 Java
Java修仙之路,十万字吐血整理全网最完整Java学习笔记(基础篇)
从Java环境的搭建到实际代码的编写,从基本用法的讲解到底层原理的剖析,深度解析Java基础知识。本文是《Java学习路线》专栏的起始文章,旨在提供一套完整的Java学习路线,覆盖Java基础知识、数据库、SSM/SpringBoot等框架、Redis/MQ等中间件、设计模式、架构设计、性能调优、源码解读、核心面试题等全面的知识点,并在未来不断更新和完善,帮助Java从业者在更短的时间内成长为高级开发。
Java修仙之路,十万字吐血整理全网最完整Java学习笔记(基础篇)
|
22天前
|
存储 安全 Java
Java修仙之路,十万字吐血整理全网最完整Java学习笔记(进阶篇)
本文是Java基础的进阶篇,对异常、集合、泛型、Java8新特性、I/O流等知识进行深入浅出的介绍,并附有对应的代码示例,重要的地方带有对性能、底层原理、源码的剖析。适合Java初学者。
Java修仙之路,十万字吐血整理全网最完整Java学习笔记(进阶篇)
|
22天前
|
存储 安全 Java
Java修仙之路,十万字吐血整理全网最完整Java学习笔记(高级篇)
本文是“Java学习路线”中Java基础知识的高级篇,主要对多线程和反射进行了深入浅出的介绍,在多线程部分,详细介绍了线程的概念、生命周期、多线程的线程安全、线程通信、线程同步,并对synchronized和Lock锁;反射部分对反射的特性、功能、优缺点、适用场景等进行了介绍。
Java修仙之路,十万字吐血整理全网最完整Java学习笔记(高级篇)
|
2月前
|
SQL druid Java
Java数据库部分(MySQL+JDBC)(二、JDBC超详细学习笔记)(下)
Java数据库部分(MySQL+JDBC)(二、JDBC超详细学习笔记)
49 3
Java数据库部分(MySQL+JDBC)(二、JDBC超详细学习笔记)(下)
|
2月前
|
SQL Java 关系型数据库
Java数据库部分(MySQL+JDBC)(二、JDBC超详细学习笔记)(上)
Java数据库部分(MySQL+JDBC)(二、JDBC超详细学习笔记)
68 3
Java数据库部分(MySQL+JDBC)(二、JDBC超详细学习笔记)(上)
|
2月前
|
SQL 关系型数据库 MySQL
Java数据库部分(MySQL+JDBC)(一、MySQL超详细学习笔记)(下)
Java数据库部分(MySQL+JDBC)(一、MySQL超详细学习笔记)
31 6
|
2月前
|
存储 关系型数据库 MySQL
Java数据库部分(MySQL+JDBC)(一、MySQL超详细学习笔记)(上)
Java数据库部分(MySQL+JDBC)(一、MySQL超详细学习笔记)
33 4
下一篇
无影云桌面