您的位置:首页 > 编程语言 > Java开发

Java 8 特性—— Streams 构造树结构

2016-04-01 00:00 399 查看
摘要: 运用 Java 8 特性—— Streams( Filter)

/*获取资源的树结构*/
@RunWith(SpringJUnit4ClassRunner.class)
@ContextConfiguration(locations = { "classpath:spring/applicationContext-beans.xml" })
public class SysResourceTree {

@Autowired
private ISysResourceService service;

/**
*
*/
@Test
public void setChildrens() {
List<SysResource> list = service.queryByObject(new SysResource());
System.out.println(">>>>>>>>>>>>>>>>>>>>>>>>>>>>>");
SysResource sysResource = new SysResource();
sysResource.setId(0l);
//        setChildren(sysResource, list);

new ObjectSetChildren<SysResource>().setChildren(sysResource, list, "parentId", "id", "children");

System.out.println(sysResource.toString());
}

/**
* 用了迭代 性能没考虑
*
* @param sysResource
* @param list
* @return
*/
public SysResource setChildren(SysResource sysResource, List<SysResource> list) {
List<SysResource> childrens = new ArrayList<SysResource>();
list.stream().filter((s) -> s.getParentId().equals(sysResource.getId())).forEach((s) -> childrens.add(s));
sysResource.setChildren(childrens);
for (SysResource child : childrens) {
setChildren(child, list);
}
return sysResource;
}
}

class ObjectSetChildren<T> {
/**
* 用了迭代 性能没考虑
*
* @param sysResource
* @param list
* @return
*/
public T setChildren(T t, List<T> list, String field1, String field2, String childField) {
List<T> childrens = new ArrayList<T>();
list.stream().filter((s) -> getV(s, field1).equals(getV(t, field2))).forEach((s) -> childrens.add(s));
try {
BeanUtils.setProperty(t, childField, childrens);
} catch (IllegalAccessException e) {
// TODO Auto-generated catch block
e.printStackTrace();
} catch (InvocationTargetException e) {
// TODO Auto-generated catch block
e.printStackTrace();
}
for (T t1 : childrens) {
setChildren(t1, list, field1, field2, childField);
}
return t;
}

/**
* Lambda 报异常 只能提取出来
* @param t
* @param field1
* @return
*/
public String getV(T t, String field1) {
try {
return BeanUtils.getProperty(t, field1).toString();
} catch (IllegalAccessException | InvocationTargetException | NoSuchMethodException e) {
System.err.println("获取字段"+field1+"错误");
e.printStackTrace();
}
return null;
}
}


封装了一下。

今天面试问了java的三个特性,嘿嘿,【封装】忘记了。
内容来自用户分享和网络整理,不保证内容的准确性,如有侵权内容,可联系管理员处理 点击这里给我发消息
标签:  Java 8 Streams 树结构