Стрим поток
Введение
В Java 8, благодаряlambda
приносит функциональное программирование, представляя совершенно новыйStream流
Концепция для решения существующих недостатков коллекций.
выгода
Сначала рассмотрим пример:
Отфильтруйте строки, начинающиеся с «zhang» в именах, чтобы получить подмножество 1, затем отфильтруйте строки длины 3 в подмножестве 1, а затем просмотрите выходные данные.
// 传统集合的方式
public static void main(String[] args) {
List<String> names = new ArrayList<>();
names.add("张三丰");
names.add("张大宝");
names.add("张三");
names.add("德玛杰");
names.add("乔峰");
names.add("李大宝");
List<String> list1 = new ArrayList<>(); //以 '张' 开头的字符串
for (String name:names){
if (name.startsWith("张")){
list1.add(name);
}
}
List<String> list2 = new ArrayList<>(); // list1中长度为 3 的字符串
for (String name:list1){
if (name.length()==3){
list2.add(name);
}
}
for (String name:list2){
System.out.println(name);
}
}
// stream流方式
public static void main(String[] args) {
List<String> names = new ArrayList<>();
names.add("张三丰");
names.add("张大宝");
names.add("张三");
names.add("德玛杰");
names.add("乔峰");
names.add("李大宝");
names.stream().filter(name->name.startsWith("张"))
.filter(name->name.length()==3).forEach(System.out::println);
}
можно увидеть сstream
Поточный метод намного проще, чем традиционный метод сбора.
Два способа получить стрим
- все
Collection
Коллекции могут бытьstream()
метод получения потока. -
Stream
статический метод классаof()
Обычно используется для преобразования массивов вstream
поток.
public static void main(String[] args) {
// 集合转成 stream 流
List<String> list = new ArrayList<>();
Stream<String> listStream = list.stream();
Set<Integer> set = new HashSet<>();
Stream<Integer> setStream = set.stream();
// 数组转成 stream 流
String[] names = new String[]{"zs","ls","ww"};
Stream<String> namesStream = Stream.of(names);
Stream<Integer> integerStream = Stream.of(1, 2, 3, 4, 5);
}
Метод классификации
stream
Методы In-Stream делятся на две категории:
- Отложенный метод, возвращаемое значение по-прежнему
Stream
тип - финализатор, возвращаемое значение больше не
Stream
типа, например:count()
иforEach()
.
Обычный метод - Фильтр ()
filter()
Преобразует поток в другой подпоток, этот метод принимаетPredicate 类型的参数
(Один из встроенных функциональных интерфейсов системы).
Stream<T> filter(Predicate<? super T> predicate);
public static void main(String[] args) {
List<String> names = new ArrayList<>();
names.add("张三丰");
names.add("张大宝");
names.add("张三");
names.add("德玛杰");
names.add("乔峰");
names.add("李大宝");
// 过滤 names 集合,只要姓张的人,然后输出
names.stream().filter(name->name.startsWith("张")).
forEach(System.out::println);
}
Функции потокового вещания - можно использовать только один раз
Stream
Потоки - это потоки по трубопроводу,можно использовать только один разКогдаStream
После того, как поток вызвал метод финализатора, он будет закрыт.Повторный вызов его метода сообщит об ошибке.
public static void main(String[] args) {
// 数组转成 stream 流
String[] names = new String[]{"zsf","ls","ww"};
Stream<String> namesStream = Stream.of(names);
namesStream.filter(name->name.length()==3).
forEach(System.out::println);
// 流已经被关闭,再次调用
namesStream.forEach(System.out::println);
}
Общий метод --map()
Если вам нужно сопоставить элементы из потока с другим потоком, вы можете использоватьmap()
Методы обычно используются для преобразования данных одного типа в данные другого типа.
<R> Stream<R> map(Function<? super T, ? extends R> mapper);
public static void main(String[] args) {
// 数组转成 stream 流
String[] strings = new String[]{"1","2","3"};
Stream<String> stream1 = Stream.of(strings);
// 使用 map 方法,将字符串类型的整数转成 Integer 类型的整数,然后遍历
Stream<Integer> stream2 = stream1.map(k->Integer.parseInt(k));
stream2.forEach(System.out::println);
}
Общий метод --limit()
limit()
Элементы в потоке могут быть перехвачены, только первые n элементов могут быть перехвачены
public static void main(String[] args) {
// 数组转成 stream 流
String[] strings = new String[]{"1","2","3","4"};
// 只截取前3个元素,输出
Stream.of(strings).limit(3).forEach(System.out::println);
}
Общий метод --skip()
Пропустить первые n элементов в потоке и вернуть поток длины 0, если n больше, чем количество элементов в потоке.
public static void main(String[] args) {
// 数组转成 stream 流
String[] strings = new String[]{"1","2","3","4"};
// 跳过前2个元素,输出
Stream.of(strings).skip(2).forEach(System.out::println);
}
Общий метод --concat()
Stream
Статический метод класса используется для слияния двух потоков.
public static void main(String[] args) {
// 数组转成 stream 流
String[] strings1 = new String[]{"1","2","3","4"};
String[] strings2 = new String[]{"3","4","5","6"};
Stream<String> stream1 = Stream.of(strings1);
Stream<String> stream2 = Stream.of(strings2);
Stream<String> stream3 = Stream.concat(stream1,stream2);
stream3.forEach(System.out::println); // 输出 1,2,3,4,3,4,5,6
}