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

原创
2016/04/01 19:39
阅读数 3.1K
/*获取资源的树结构*/
@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的三个特性,嘿嘿,【封装】忘记了。

展开阅读全文
打赏
1
3 收藏
分享
加载中
更多评论
打赏
0 评论
3 收藏
1
分享
返回顶部
顶部