select操作,获取list中bean对象中的某一列值
业务场景:通常我们获取list中bean对象中的某个属性值,需要写一个for 循环,代码会比较冗余。话不多说,直接上代码
1、自定义方法
public interface Select<T> {
T select(Object obj) ;
}
/*
*选择对象集合的属性值
*<T extends Comparable<T> ,D>
*/
public static final <T,D> Set<T> select(Collection<D> colls ,String fieldName){
return select(colls,new Select<T>(){
@Override
public T select(Object obj){
Object v=getFieldValueByName(obj,fieldName);
return (T)v;
}
});
}
/**
* 通过接口函数选择对象集合的属性值
* @param colls
* @param gb
* @return 这里使用set作为返回值是为了去重,当然也可以使用List
* <T extends Comparable<T> ,D>
*/
public static final <T,D> Set<T> select(Collection<D> colls,Select<T> gb){
Iterator<D> iter = colls.iterator() ;
Set<T> set=new HashSet<T>();
while(iter.hasNext()) {
D d = iter.next() ;
T t = gb.select(d) ;
if(t!=null){
set.add(t);
}
}
return set;
}
2、Java stream流
-
获取某一列的值,并且装换为String,先撸代码
public static void main(String[] args) { List<User> list = new ArrayList(); User user1 = new User(); user1.setId(1L); user1.setMobile("123456"); list.add(user1); User user2 = new User(); user2.setId(2L); user1.setMobile("12345678"); list.add(user2); //获取某一列的值 List<String> ids = list.stream().map(f -> f.getId()).collect(Collectors.toList()); System.out.println(ids); }
原理
对于stream流中包含的元素,使用给定的转换函数(f -> String.valueOf(f.getId())),进行转换操作,新生成的stream流只包含转换生成的元素。
map方法还有三个对于原始类型的变种方法,分别是:mapToInt,mapToLong和mapToDouble。这三个方法也比较好理解,比如mapToInt就是把原始Stream转换成一个新的Stream,这个新生成的Stream中的元素都是int类型。之所以会有这样三个变种方法,可以免除自动装箱/拆箱的额外消耗;
3、获取list中bean对象中的某一列值,并且转换类型
public static void main(String[] args)
{
List<User> list = new ArrayList();
User user1 = new User();
user1.setId(1L); user1.setMobile("123456");
list.add(user1);
User user2 = new User();
user2.setId(2L); user1.setMobile("12345678");
list.add(user2);
//获取某一列的值,并且装换为String
List<String> ids = list.stream().map(f -> String.valueOf(f.getId())).collect(Collectors.toList());
System.out.println(ids);
}