Приветствую Вас ГостьСреда, 15.05.2024, 00:56

Программирование на Java, Android, Delphi


Блог

Главная » 2015 » Ноябрь » 19 » Stream API и Lambda в Java 8
16:55
Stream API и Lambda в Java 8

Несколько примеров использования потокового API и лямбд в Java (работают начиная с 8 версии)

import java.io.File;
import java.math.BigDecimal;
import java.util.Arrays;
import java.util.Comparator;
import java.util.List;
import java.util.Optional;
import java.util.Random;
import java.util.Spliterator;
import java.util.function.Consumer;
import java.util.function.Predicate;
import java.util.stream.Collectors;
import java.util.stream.Stream;


public class MainClass {
 
 private static void ln(){
 System.out.println("-------------------------------------------");
 }
 
 private static void disp(Object val){
 System.out.println(val.toString());
 }

 public static void main(String[] args) {
 
 ln();
 disp("вывод списка через лямбду");
 List strList = Arrays.asList("aaa", "fff", "cccc", "vvv", "bbb");
 strList.forEach(action -> System.out.println(action));
 
 ln();
 disp("вызов операций реализованные лямбдой");
 Tester tester = new Tester();
 MyAction action1 = tester.getAction();
 action1.doAction();
 
 MyCalculate calc1 = tester.getSummaOperation();
 System.out.println(calc1.operation(100, 200));
 
 calc1 = tester.getDiffOperation();
 System.out.println(calc1.operation(100, 200));
 
 calc1 = tester.getBiggest();
 System.out.println(calc1.operation(120, 150));
 
 calc1 = tester.getLowest();
 System.out.println(calc1.operation(99, 98));
 
 
 ln();
 disp("сортировка списка - компаратор через анонимный класс");
 List int_array = Arrays.asList(22, 56, 34, 5665, 34, 5757, 32);
 //Arrays.sort(int_array, (a, b) -> a > b);
 int_array.sort(new Comparator(){

 @Override
 public int compare(Integer o1, Integer o2) {
 return o2 - o1;
 }
 
 });
 int_array.forEach(value -> disp(value));
 
 ln();
 disp("сортировка списка через лямбду");
 int_array.sort((a, b) -> a - b);
 int_array.forEach(value -> disp(value));
 
 ln();
 disp("Файлы в директории");
 File file = new File("D:\\distrib");
 List fileList = Arrays.asList(file.listFiles());
 fileList.forEach(item -> disp(item.getAbsolutePath()));
 
 ln();
 disp("Только папки в директории");
 fileList.stream().filter(item -> item.isDirectory()).forEach(item -> disp(item.getAbsolutePath()));
 
 ln();
 disp("Только файлы в директории");
 fileList.stream().filter(Tester::isFolder).forEach(item -> disp(item.getAbsolutePath()));
 
 ln();
 disp("Только файлы zip и jar");
 Predicate isZipPredicate = Tester::isZipFile;
 Predicate isExePredicate = Tester::isExeFile;
 fileList.stream().filter(isZipPredicate.or(isExePredicate)).forEach(item -> disp(item.getName())); 
 
 ln();
 disp("Потестим потоковый API");
 List strings = Arrays.asList("begin", "", "sdfsf", "efwerwg", "abffsfsfsfcd","", "ajkl", "sdfsffsfsfsf", "", "the end", "ahsdjsd");
 strings.stream().filter(string -> !string.isEmpty()).map(item -> item.toUpperCase()).collect(Collectors.toList()).forEach(System.out::println);
 
 ln();
 disp("Фильтрация - выведем элементы списка начинающиеся на \"a\"");
 strings.stream().filter(predicate -> predicate.startsWith("a")).forEach(System.out::println);
 
 ln();
 disp("Заменим все пустые элементы на константы");
 strings.stream().map(item -> {if(item.isEmpty()) return "CONST"; return item;}).forEach(System.out::println);
 
 
 ln();
 disp("Заменим все пустые элементы на константы и ограничим 5 элементами");
 Consumer print = System.out::println;
 strings.stream().map(item -> {if(item.isEmpty()) return "CONST"; return item;}).limit(5).forEach(print);
 
 ln();
 disp("Отсортируем случайные числа");
 Random random = new Random();
 random.ints().limit(10).sorted().forEach(System.out::println);
 
 ln();
 disp("Заменим все пустые элементы на константы и отсортируем без учета регистра");
 strings.stream().map(item -> {if(item.isEmpty()) return "CONST"; return item;}).sorted((a, b) -> a.compareToIgnoreCase(b)).forEach(print);
 
 ln();
 disp("Выведем количество пустых элементов");
 disp(strings.parallelStream().filter(string -> string.isEmpty()).count());
 
 
 ln();
 disp("Используем peek");
 Stream.of("one", "two", "three", "sdfsdf","osdfsdfne", "sdfhrfyry", "three", "rtyrtyrty","oyuyuyune", "twyuyuyo", "thryuee", "fouyututr","onyuyuye", "tyutyuttyutyuwo", "thtyutyutree", "fouryuyuyu")
 .filter(e -> e.length() > 3)
 .peek(e -> System.out.println("Filtered value: " + e))
 .map(String::toUpperCase)
 .peek(e -> System.out.println("Mapped value: " + e))
 .collect(Collectors.toList());
 
 ln();
 disp("Используем reduce для умножения нечетных элементов списка");
 List int_arr = Arrays.asList(1, 2, 3, 4, 5);
 Optional res = int_arr.stream().filter(n -> n % 2 == 1).reduce((a, b) -> a*b);
 if(res.isPresent()) disp(res.get());
 
 ln();
 disp("Используем reduce для умножения нечетных элементов списка");
 res = int_arr.stream().reduce((a, b) -> {if(b % 2 == 1) return a * b; return a;});
 if(res.isPresent()) disp(res.get());
 
 ln();
 disp("Используем Сплитератор");
 Spliterator spl = Stream.of("one", "two", "three", "for", "fiveee").spliterator();
 spl.forEachRemaining(item -> disp(item));
 
 disp("еще раз Сплитератор");
 spl = Stream.of("one", "two", "three", "for", "fiveee").spliterator();
 while(spl.tryAdvance(item -> disp(item)));
 
 ln();
 disp("Используем map для преобразования потока строк в поток целых чисел, содержащих их длину");
 Stream strStream = Stream.of("one", "two", "three", "for", "fiveee");
 strStream.map(item -> new Integer(item.length())).forEach(item -> disp(item.toString()));
 
 ln();
 disp("Определяем вхождение элемента в потоке по критерию");
 List listValues = Arrays.asList("alex", "andrey", "aleksey", "adam", "angella", "alena", "arkadiiy");
 
 disp("любое вхождение");
 disp(listValues.stream().anyMatch(val -> val.startsWith("ang")));
 disp("все вхождения");
 disp(listValues.stream().allMatch(val -> val.startsWith("a")));
 disp("количество элементов в потоке");
 disp(listValues.stream().count());
 
 ln();
 disp("Попробуем ссылку на метод");
 listValues.stream().forEach(System.out::println);
 
 ln();
 disp("Попробуем параллельный поток на метод");
 listValues.parallelStream()
 .filter(e -> e.length() > 3)
 .peek(e -> System.out.println("Filtered value: " + e))
 .map(String::toUpperCase)
 .peek(e -> System.out.println("Mapped value: " + e))
 .collect(Collectors.toList());
 
 ln();
 disp("Конкатенация сведением");
 
 disp(listValues.stream().reduce((a, b) -> a + "_" + b).get());
 
 ln();
 disp(listValues.stream().reduce((a, b) -> a + "_" + b).orElse("Пустая строка"));
 ln();
 disp("сумма длинн слов в коллекции");
 disp(listValues.stream().map(str -> str.length()).reduce((a, b) -> a + b).orElse(0));
 
 disp("сумма длинн слов в коллекции с использовванием reduce (версия со значением идентичности) его можно расматривать как начальное значение");
 disp(listValues.stream().map(str -> str.length()).reduce(5, (a, b) -> a + b));
 
 disp(listValues.stream().map(str -> str.length()).reduce(5, (a, b) -> a + b));
 
 ln();
 disp("reduce с накоплением и объединением");
 List int_list = Arrays.asList(1.0, 4.0, 9.0, 1.0, 9.0, 1.0);
 disp(int_list.stream().peek(el -> System.out.println("el: " + el)).reduce(1.0 , (x, y) -> {disp("x = " + x); disp("y = " + y); return x * Math.sqrt(y);}, (a, b) -> {disp("a = " + a); disp("b = " + b); return a * b;}));
 ln();
 disp("reduce с накоплением и объединением");
 disp(int_list.stream().peek(el -> System.out.println("el: " + el)).reduce((x, y) -> x * Math.sqrt(y)).get());
 
 ln();
 final List prices = Arrays.asList(
 new BigDecimal("10"), new BigDecimal("30"), new BigDecimal("17"),
 new BigDecimal("20"), new BigDecimal("15"), new BigDecimal("18"),
 new BigDecimal("45"), new BigDecimal("12"));
 
 BigDecimal totalOfDiscountedPrices = BigDecimal.ZERO;
 for(BigDecimal price : prices) {
 if(price.compareTo(BigDecimal.valueOf(20)) > 0)
 totalOfDiscountedPrices =
 totalOfDiscountedPrices.add(price.multiply(BigDecimal.valueOf(0.9)));
 }
 System.out.println("Total of discounted prices: " + totalOfDiscountedPrices);
 
 totalOfDiscountedPrices =
 prices.stream()
 .filter(price -> price.compareTo(BigDecimal.valueOf(20)) > 0)
 .map(price -> price.multiply(BigDecimal.valueOf(0.9)))
 .reduce(BigDecimal.ZERO, BigDecimal::add);
 System.out.println("Total of discounted prices: " + totalOfDiscountedPrices);
 

 }

}

Категория: Java (Общие вопросы) | Просмотров: 897 | Добавил: alex | Теги: stream api, Lambda, Java | Рейтинг: 0.0/0
Категории раздела
Java (Общие вопросы) [17]
Java (Библиотека, пакеты Java) [17]
Java (Разработка программного обеспечения на Java) [5]
Java (Среда разработки NetBeans) [5]
JSF + PrimeFaces [21]
Java EE [11]
Разное [3]
Статистика

Онлайн всего: 1
Гостей: 1
Пользователей: 0
Форма входа
Поиск
Календарь
«  Ноябрь 2015  »
ПнВтСрЧтПтСбВс
      1
2345678
9101112131415
16171819202122
23242526272829
30
Архив записей