Одна из основных задач, выполняемых над коллекциями, это проход по всей коллекции и выполнение над её элементами какого-либо действия:
1 2 3 4 5 6 7 | public Collection<String> iterateOldSchool() { Collection<String> upper = new ArrayList<>(); for (String s : LONG_WELCOME) { upper.add(s.toUpperCase()); } return upper; } |
В Java8 у интерфейса Iterable появился метод forEach, принимающий лямбда-выражение и применяющий это выражение на каждый элемент коллекции:
1 2 3 4 5 | public Collection<String> forEach() { Collection<String> upper = new ArrayList<>(); LONG_WELCOME.forEach(s -> upper.add(s.toUpperCase())); return upper; } |
Особенно удобно использовать forEach с Map:
1 2 3 4 5 | public Map<Integer, String> forEachMap() { Map<Integer, String> upper = new HashMap<>(); MAP.forEach((k, v) -> upper.put(k, v.toUpperCase())); return upper; } |
В сравнении с классическим подходом выигрыш в читаемости кода налицо:
1 2 3 4 5 6 7 | public Map<Integer,String> iterateMapOldSchool() { Map<Integer, String> upper = new HashMap<>(); for (Map.Entry<Integer, String> entry: MAP.entrySet()) { upper.put(entry.getKey(), entry.getValue().toUpperCase()); } return upper; } |
Код примера доступен на github.