Java 8 特性—— Streams 構造樹結構

/*獲取資源的樹結構*/
@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的三個特性,嘿嘿,【封裝】忘記了。
面試

相關文章
相關標籤/搜索