Java 寫類C# Lamda表示式
阿新 • • 發佈:2018-11-01
用過C#的人都知道lamda表示式作用於集合的power!簡潔、易用、可讀性強。比如從一個集合中取出所有符合某一條件的所有項:
var fields = skuField.GetFieldList();
<pre name="code" class="csharp">//取出屬性集合中型別為單選型別且屬性ID字串含有“_20549_29148” 的所有屬性項
var sizeFields = fields.FindAll(f => f.Type == FieldTypeEnum.SINGLECHECK && f.Id.Contains("_20549_29148"));
現在如何在java 低版本中如何實現類似功能?
可能是這樣:
如果不想總這麼寫迴圈,有沒有更“優雅”點的方式呢?類C#中的Lamda表示式。<span style="white-space:pre"> </span>List<Field> fields = skuField.getFieldList(); List<Field> sizeFields = new ArrayList<Field>(); for (Field f : fields) { if (f.getType() == FieldTypeEnum.SINGLECHECK && f.getId().contains("_20549_29148")) {// 歐碼 sizeFields.add(f); } }
一、從集合中取出符合條件的項:
1、我們可以建立條件介面IMatch,如下
/**
* @author zhaojiwei YGCollectionInterface 2015年4月16日
* @param <T>
*/
public interface IMatch<T> {
boolean match(T t);
}
再建立一個集合幫助類YGCollectionHelper,專門實現一些方法,比如find,findAll等
我們該如何使用該集合輔助類呢?很簡單,如下程式碼:/** * @author zhaojiwei YGCollectionHelper 2015年4月16日 */ public class YGCollectionHelper { public static <T> T find(Collection<T> list, IMatch<T> collectionInterface) { if (CollectionUtils.isEmpty(list)) { return null; } for (T t : list) { if (collectionInterface.match(t)) { return t; } } return null; } public static <T> List<T> findAll(Collection<T> list, IMatch<T> collectionInterface) { if (CollectionUtils.isEmpty(list)) { return null; } List<T> ts = new ArrayList<T>(); for (T t : list) { if (t != null && collectionInterface.match(t)) { ts.add(t); } } return ts; } }
@Test
public void testYGCollection() {
List<Brand> brands = commodityBaseApiService.getAllBrands();
Brand brand = YGCollectionHelper.find(brands, new IMatch<Brand>() {
@Override
public boolean match(Brand b) {
return b.getBrandName().equals("耐克"); //boolean表示式:選出品牌名稱為耐克的品牌項
}
});
if (brand != null) {
System.out.println(brand.getBrandDesc());
}
List<Brand> list1 = YGCollectionHelper.findAll(brands, new IMatch<Brand>() {
@Override
public boolean match(Brand t) {
return t.getDelFlag().equals(1); //選出集合中未刪除的項
}
});
if (list1 != null) {
System.out.println(list1.size());
}
List<String> brandNames = YGCollectionHelper.select(brands, new ISingleMapping<Brand, String>() {
@Override
public String func(Brand t) {
if (t == null || StringUtils.isBlank(t.getBrandName())) { return null; }
return t.getBrandName();
}
});
if (CollectionUtils.isNotEmpty(brandNames)) {
for (String brandName : brandNames) {
System.out.println(brandName);
}
}
}
二、將一個集合中的元素對映為另一個元素集合(功能類似C# select、selectMany方法)
/**
* @author zhaojiwei
* IYGCollectionMapping
* 2015年4月16日
*/
public interface ISingleMapping<T,E> {
E func(T t);
}
多元素同時對映:
/**
* @author zhaojiwei IManyMapping 2015年4月16日
*/
public interface IManyMapping<T, E> {
Collection<E> selectMany(T t);
}
public static <T, E> List<E> select(Collection<T> list, ISingleMapping<T, E> singleMappingInterface) {
if (CollectionUtils.isEmpty(list)) { return null; }
List<E> result = new ArrayList<E>();
for (T t : list) {
E e = singleMappingInterface.func(t);
if (e != null) {
result.add(e);
}
}
return result;
}
public static <T, E> List<E> selectMany(Collection<T> list, IManyMapping<T, E> manyMapping) {
if (CollectionUtils.isEmpty(list)) { return null; }
List<E> result = new ArrayList<E>();
Collection<E> e = null;
for (T t : list) {
e = manyMapping.selectMany(t);
if (e != null) {
result.addAll(e);
}
}
return result;
}
如何使用?
List<String> brandNames = YGCollectionHelper.select(brands, new ISingleMapping<Brand, String>() {
@Override
public String func(Brand t) {
if (t == null || StringUtils.isBlank(t.getBrandName())) { return null; }
return t.getBrandName();
}
});
if (CollectionUtils.isNotEmpty(brandNames)) {
for (String brandName : brandNames) {
System.out.println(brandName);
}
}
三、其它功能點的實現
/**
* @Date:2015年4月16日
* @Author: zhaojiwei
* @Description:
*/
package com.yougou.gms.utils.ygcollection;
import java.util.ArrayList;
import java.util.Collection;
import java.util.List;
import com.alibaba.dubbo.common.utils.CollectionUtils;
/**
* @author zhaojiwei YGCollectionHelper 2015年4月16日
*/
public class YGCollectionHelper {
public static <T> T first(Collection<T> list) {
if (CollectionUtils.isEmpty(list)) return null;
int i = 0;
for (T t : list) {
if (i++ == 0) { return t; }
}
return null;
}
public static <T> boolean exists(Collection<T> list, IMatch<T> collectionInterface) {
if (CollectionUtils.isEmpty(list)) { return false; }
for (T t : list) {
if (collectionInterface.match(t)) { return true; }
}
return false;
}
public static <T> boolean all(Collection<T> list, IMatch<T> collectionInterface) {
if (CollectionUtils.isEmpty(list)) { return false; }
for (T t : list) {
if (!collectionInterface.match(t)) { return false; }
}
return true;
}
public static <T> boolean any(Collection<T> list, IMatch<T> collectionInterface) {
return exists(list, collectionInterface);
}
public static <T> T find(Collection<T> list, IMatch<T> collectionInterface) {
if (CollectionUtils.isEmpty(list)) { return null; }
for (T t : list) {
if (collectionInterface.match(t)) { return t; }
}
return null;
}
public static <T> List<T> findAll(Collection<T> list, IMatch<T> collectionInterface) {
if (CollectionUtils.isEmpty(list)) { return null; }
List<T> ts = new ArrayList<T>();
for (T t : list) {
if (t != null && collectionInterface.match(t)) {
ts.add(t);
}
}
return ts;
}
public static <T, E> List<E> select(Collection<T> list, ISingleMapping<T, E> singleMappingInterface) {
if (CollectionUtils.isEmpty(list)) { return null; }
List<E> result = new ArrayList<E>();
for (T t : list) {
E e = singleMappingInterface.func(t);
if (e != null) {
result.add(e);
}
}
return result;
}
public static <T, E> List<E> selectMany(Collection<T> list, IManyMapping<T, E> manyMapping) {
if (CollectionUtils.isEmpty(list)) { return null; }
List<E> result = new ArrayList<E>();
Collection<E> e = null;
for (T t : list) {
e = manyMapping.selectMany(t);
if (e != null) {
result.addAll(e);
}
}
return result;
}
}
在使用方法輔助類時,獲取集合或作集合對映時,我們的重點或者說關注點集中在 條件表示式上,不用在反覆滴寫foreach迴圈遍歷了。