Create a map of String and sorted list using Java 8 streams API

Abhilash :

I have the following classes:

class Data {
        String systemId;
        String fileName;
        int x;
        int y;

        Data(String systemId, String fileName, int x, int y) {
            this.systemId = systemId;
            this.fileName = fileName;
            this.x = x;
            this.y = y;
        }
        public String getSystemId() {
            return systemId;
        }

        public void setSystemId(String systemId) {
            this.systemId = systemId;
        }

        public String getFileName() {
            return fileName;
        }

        public void setFileName(String fileName) {
            this.fileName = fileName;
        }

        public int getX() {
            return x;
        }

        public void setX(int x) {
            this.x = x;
        }

        public int getY() {
            return y;
        }

        public void setY(int y) {
            this.y = y;
        }
    }


class Result {
        int x;
        int y;

        Result(int x, int y) {
            this.x = x;
            this.y = y;
        }

        public int getX() {
            return x;
        }

        public void setX(int x) {
            this.x = x;
        }

        public int getY() {
            return y;
        }

        public void setY(int y) {
            this.y = y;
        }
    }

List<Data> dataList = new ArrayList<>();
Data x1 = new Data("n1", "f1", 3, 4);
Data x2 = new Data("n1", "f1", 1, 2);
Data x3 = new Data("n1", "f1", 5, 6);
Data x4 = new Data("n1", "f2", 7, 8);
Data x5 = new Data("n2", "f1", 9, 10);
Data x6 = new Data("n2", "f2", 11, 12);
Data x7 = new Data("n3", "f1", 13, 14);
Data x8 = new Data("n4", "f1", 15, 16);
Data x9 = new Data("n1", "f1", 5, 10);
Data x10 = new Data("n1", "f1", 5, 2);

dataList.add(x1);dataList.add(x2);dataList.add(x3);dataList.add(x4);dataList.add(x5);dataList.add(x6);dataList.add(x7);dataList.add(x8);

I want to use Java streams to create a Map<String, List<Result>> out of the given input list. Also, the list values needs to be sorted in ascending order according to fields (x and y)

I need the output map to be as follows:

{"n1:f1" : [(1, 2), (3, 4), (5, 2), (5,6), (5,10)]
 "n1:f2" : [(7, 8)]
 "n2:f1" : [(9, 10)]
 "n2:f2" : [(11, 12)]
 "n3:f1" : [(13, 14)]
 "n4:f1" : [(15, 16)]
}

The key for the map is the combination of systemid and filename concatenated by colon. The values of the list needs to be first sorted by x and then y.

Adrian :

something like:

Map<String, List<Result>> collect = dataList.stream()
            .sorted(Comparator.comparing(Data::getX).thenComparing(Data::getY))
            .collect(Collectors.groupingBy(d ->  d.getSystemId() + ":" + d.getFileName(),
                    Collectors.mapping(d -> new Result(d.getX(), d.getY()), toList())));

Guess you like

Origin http://43.154.161.224:23101/article/api/json?id=142614&siteId=1