Java 8里的Predicate学习笔记
測(cè)試代碼:
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));Predicate的源代碼:
/*** 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*/Predicate接受一個(gè)類型作為參數(shù),返回布爾值。
因此代碼里我就可以使用第113行這種箭頭函數(shù),country為箭頭函數(shù)或者說Lambda Function里的形式參數(shù)(輸入?yún)?shù)),因?yàn)镻redicate接收的泛型參數(shù)為T- Country,所以編譯器能斷定,形式參數(shù)的類型一定為Country.
最后用collect,傳入Collectors.toList().
collect方法將傳入的Collector施加到stream的元素內(nèi),
Collectors.toList的操作:將流里的元素添加到一個(gè)List容器里并返回。
Returns a Collector that accumulates the input elements into a new List. There are no guarantees on the type, mutability, serializability, or thread-safety of the List returned
完整的測(cè)試代碼:
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;}@Overridepublic 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;}@Overridepublic 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之所以被稱為內(nèi)部遍歷器,原因在于一旦它開始執(zhí)行了,那么遍歷操作就不能夠被輕易中斷。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));} }要獲取更多Jerry的原創(chuàng)文章,請(qǐng)關(guān)注公眾號(hào)"汪子熙":
總結(jié)
以上是生活随笔為你收集整理的Java 8里的Predicate学习笔记的全部內(nèi)容,希望文章能夠幫你解決所遇到的問題。
- 上一篇: 龙芯中科一季度营收 7.39 亿元同比下
- 下一篇: msvcp140.dll丢失的解决方法是