范文健康探索娱乐情感热点
投稿投诉
热点动态
科技财经
情感日志
励志美文
娱乐时尚
游戏搞笑
探索旅游
历史星座
健康养生
美丽育儿
范文作文
教案论文
国学影视

JavaStream操作这么多,其实只有两大类,看完这篇就清晰了

  本节内容是 Stream API 中常用操作的学习和理解,下面会专门再有一篇文章介绍在项目开发中那些高频使用的利用 Stream 处理对象集合的使用示例。
  本文大纲如下:
  Java 的 Stream API 提供了一种处理对象集合的函数式方法。 Stream 是 Lambda 表达式等其他几个函数式编程特性一起在 Java 8 被引入的这个篇教程将解释这些函数式 Stream 是如何工作的,以及怎么使用它们。
  注意,Java 的 Stream API 与 Java IO 的 InputStream 和 OutputStream 没有任何关系,不要因为名字类似造成误解。 InputStream 和 OutputStream 是与字节流有关,而 Java 的 Stream API 用于处理对象流。Stream 的定义
  Java 的 Stream 是一个能够对其元素进行内部迭代的组件,这意味着它可以自己迭代其元素。相反地,当我们使用 Collection 的迭代功能,例如,从 Collection 获取Iterator 或者使用 Iterable 接口 的 forEach 方法这些方式进行迭代时,我们必须自己实现集合元素的迭代逻辑。
  当然集合也支持获取 Stream 完成迭代,这些我们在介绍集合框架的相关章节都介绍过。流处理
  我们可以将 Listener 方法或者叫处理器方法附加到 Stream 上。当 Stream 在内部迭代元素时,将以元素为参数调用这些处理器。Stream 会为流中的每个元素调用一次处理器。所以每个处理器方法都可以处理 Stream 中的每个元素,我们把这称为流处理。
  流的多个处理器方法可以形成一个调用链。链上的前一个处理器处理流中的元素,返回的新元素会作为参数传给链中的下一个处理器处理。当然,处理器可以返回相同的元素或新元素,具体取决于处理器的目的和用途。怎么获取流
  有很多方法获取 Stream ,一般最常见的是从 Collection 对象中获取 Stream。下面是一个从 List 对象获取 Stream 的例子。List items = new ArrayList();  items.add("one"); items.add("two"); items.add("three");  Stream stream = items.stream();     复制代码
  集合对象都实现了 Collection 接口,所以通过接口里定义的 stream 方法获救获取到由集合元素构成的 Steam。流处理的构成
  在对流进行处理时,不同的流操作以级联的方式形成处理链。一个流的处理链由一个源(source),0 到多个中间操作(intermediate operation)和一个终结操作(terminal operation)完成。源:源代表 Stream 中元素的来源,比如我们上面看到的集合对象。中间操作:中间操作,在一个流上添加的处理器方法,他们的返回结果是一个新的流。这些操作是延迟执行的,在终结操作启动后才会开始执行。终结操作:终结流操作是启动元素内部迭代、调用所有处理器方法并最终返回结果的操作。
  概念听起来有点模糊,我们通过流处理的例子再理解一下。import java.util.ArrayList; import java.util.List; import java.util.stream.Stream;  public class StreamExamples {      public static void main(String[] args) {         List stringList = new ArrayList<>();          stringList.add("ONE");         stringList.add("TWO");         stringList.add("THREE");          Stream stream = stringList.stream();          long count = stream                 .map((value) -> value.toLowerCase())                 .count();          System.out.println("count = " + count);      } } 复制代码
  map() 方法的调用是一个中间操作。它只是在流上设置一个 Lambda 表达式,将每个元素转换为小写形式。而对 count() 方法的调用是一个终结操作。此调用会在内部启动迭代,开始流处理,这将导致每个元素都转换为小写然后计数。
  将元素转换为小写实际上并不影响元素的计数。转换部分只是作为 map() 是一个中间操作的示例。流的中间操作
  Stream API 的中间(非终结)流操作是转换或者过滤流中元素的操作。当我们把中间操作添加到流上时,我们会得到一个新的流作为结果。下面是一个添加到流上的中间操作的示例,它的执行结果会产生一个新的流。List stringList = new ArrayList<>();  stringList.add("ONE"); stringList.add("TWO"); stringList.add("THREE");      Stream stream = stringList.stream();      Stream stringStream =     stream.map((value) -> value.toLowerCase()); 复制代码
  上面例子中,流上添加的 map() 调用,此调用实际上返回一个新的 Stream 实例,该实例表示原始字符串流应用了 map 操作后的新流。 只能将单个操作添加到给定的 Stream 实例上。如果需要将多个操作连接在一起,则只能将第二个操作应用于第一个操作产生的 Stream 实例上。Stream stringStream1 =         stream.map((value) -> value.toLowerCase());  Stream<½String> stringStream2 =         stringStream1.map((value) -> value.toUpperCase()); 复制代码
  注意第二个 map() 调用是如何在第一个 map() 调用返回的 Stream 上进行调用的。
  我们一般是将 Stream 上的所有中间操作串联成一个调用链:Stream stream1 = stream   .map((value) -> value.toLowerCase())   .map((value) -> value.toUpperCase())   .map((value) -> value.substring(0,3)); 复制代码
  以 map方法为代表流间操作方法的参数,是一个函数式接口,我们可以直接用 Lambda 表达式作为这些操作的参数。所以在介绍 Lambda 的那一节我们也说过,Lambda 一般是和流操作就结合起来用的。
  **参考--Java 的函数式接口: **tutorials.jenkov.com/java-functi…
  下面我们说一下常用的流的中间操作。map
  map() 方法将一个元素转换(或者叫映射)到另一个对象。例如,一个字符串列表,map() 可以将每个字符串转换为小写、大写或原始字符串的子字符串,或完全不同的东西。List list = new ArrayList(); Stream stream = list.stream();  Stream streamMapped = stream.map((value) -> value.toUpperCase()); 复制代码filter
  filter() 用于从 Stream 中过滤掉元素。 filter 方法接受一个 Predicate (也是一个函数式接口),filter() 为流中的每个元素调用 Predicate。如果元素要包含在 filter() 返回结果的流中,则 Predicate 应返回 true。如果不应包含该元素,则 Predicate 应返回 false。Stream longStringsStream = stream.filter((value) -> {     // 元素长度大于等于3,返回true,会被保留在 filter 产生的新流中。     return value.length() >= 3; }); 复制代码
  比如 Stream 实例应用了上面这个 filter 后,filter 返回的结果流里只会包含长度不小于 3 的元素。flatMap
  flatMap方法接受一个 Lambda 表达式, Lambda 的返回值必须也是一个stream类型,flatMap方法最终会把所有返回的stream合并。map 与 flatMap 方法很像,都是以某种方式转换流中的元素。如果需要将每个元素转换为一个值,则使用 map 方法,如果需要将每个元素转换为多个值组成的流,且最终把所有元素的流合并成一个流,则需要使用 flatMap 方法。 在效果上看是把原来流中的每个元素进行了"展平"import java.util.ArrayList; import java.util.Arrays; import java.util.List; import java.util.stream.Stream;  public class StreamFlatMapExamples {      public static void main(String[] args) {          List stringList = new ArrayList();          stringList.add("One flew over the cuckoo"s nest");         stringList.add("To kill a muckingbird");         stringList.add("Gone with the wind");          Stream stream = stringList.stream();          stream.flatMap((value) -> {             String[] split = value.split(" ");             return Arrays.asList(split).stream();         }).forEach((value) -> System.out.println(value));      } } 复制代码
  在上面的例子中,每个字符串元素被拆分成单词,变成一个 List,然后从这个 List 中获取并返回流,flatMap 方法最终会把这些流合并成一个,所以最后用流终结操作 forEach 方法,遍历并输出了每个单词。One flew over the cuckoo"s nest To kill a muckingbird Gone with the wind 复制代码distinct
  distinct() 会返回一个仅包含原始流中不同元素的新 Stream 实例,任何重复的元素都将会被去掉。List stringList = new ArrayList();  stringList.add("one"); stringList.add("two"); stringList.add("three"); stringList.add("one");  Stream stream = stringList.stream();  List distinctStrings = stream         .distinct()         .collect(Collectors.toList());  System.out.println(distinctStrings); 复制代码
  在这个例子中,元素 "one" 在一开始的流中出现了两次,原始流应用 distinct 操作生成的新流中将会丢弃掉重复的元素,只保留一个 "one" 元素。所以这个例子最后的输出是:[one, two, three] 复制代码limit
  limit 操作会截断原始流,返回最多只包含给定数量个元素的新流。import java.util.ArrayList; import java.util.List; import java.util.stream.Stream;  public class StreamLimitExample {      public static void main(String[] args) {          List stringList = new ArrayList();          stringList.add("one");         stringList.add("two");         stringList.add("three");         stringList.add("one");          Stream stream = stringList.stream();         stream.limit(2)               .forEach( element -> System.out.println(element));      } } 复制代码
  这个例子中,因为对原始流使用了 limit(2) 操作,所以只会返回包含两个元素的新流,随后使用 forEach 操作将它们打印了出来。程序最终将会输出:one two 复制代码peek
  peek() 方法是一个以 Consumer (java.util.function.Consumer,Consumer 代表的是消费元素但不返回任何值的方法) 作为参数的中间操作,它返回的流与原始流相同。当原始流中的元素开始迭代时,会调用 peek 方法中指定的 Consumer 实现对元素进行处理。
  正如 peek 操作名称的含义一样,peek() 方法的目的是查看流中的元素,而不是转换它们。跟其他中间操作的方法一样,peek() 方法不会启动流中元素的内部迭代,流需要一个终结操作才能开始内部元素的迭代。
  peek() 方法在流处理的 DEBUG 上的应用甚广,比如我们可以利用 peek() 方法输出流的中间值,方便我们的调试。Stream.of("one", "two", "three","four").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()); 复制代码
  上面的例子会输出以下调试信息。Filtered value: three Mapped value: THREE Filtered value: four Mapped value: FOUR 复制代码流的终结操作
  Stream 的终结操作通常会返回单个值,一旦一个 Stream 实例上的终结操作被调用,流内部元素的迭代以及流处理调用链上的中间操作就会开始执行,当迭代结束后,终结操作的返回值将作为整个流处理的返回值被返回。long count = stream   .map((value) -> value.toLowerCase())   .map((value) -> value.toUpperCase())   .map((value) -> value.substring(0,3))   .count(); 复制代码
  Stream 的终结操作 count() 被调用后整个流处理开始执行,最后将 count() 的返回值作为结果返回,结束流操作的执行。这也是为什么把他们命名成流的终结操作的原因。
  上面例子,应用的中间操作 map 对流处理的结果并没有影响,这里只是做一下演示。
  下面我们把常用的流终结操作说一下。anyMatch
  anyMatch() 方法以一个 Predicate (java.util.function.Predicate 接口,它代表一个接收单个参数并返回参数是否匹配的函数)作为参数,启动 Stream 的内部迭代,并将 Predicate 参数应用于每个元素。如果 Predicate 对任何元素返回了 true(表示满足匹配),则 anyMatch() 方法的结果返回 true。如果没有元素匹配 Predicate,anyMatch() 将返回 false。import java.util.ArrayList; import java.util.List; import java.util.stream.Stream;  public class StreamAnyMatchExample {      public static void main(String[] args) {          List stringList = new ArrayList();          stringList.add("One flew over the cuckoo"s nest");         stringList.add("To kill a muckingbird");         stringList.add("Gone with the wind");          Stream stream = stringList.stream();          boolean anyMatch = stream.anyMatch((value) -> value.startsWith("One"));         System.out.println(anyMatch);      } } 复制代码
  上面例程的运行结果是 true , 因为流中第一个元素就是以 "One" 开头的,满足 anyMatch 设置的条件。allMatch
  allMatch() 方法同样以一个 Predicate 作为参数,启动 Stream 中元素的内部迭代,并将 Predicate 参数应用于每个元素。如果 Predicate 为 Stream 中的所有元素都返回 true,则 allMatch() 的返回结果为 true。如果不是所有元素都与 Predicate 匹配,则 allMatch() 方法返回 false。import java.util.ArrayList; import java.util.List; import java.util.stream.Stream;  public class StreamAllMatchExample {      public static void main(String[] args) {          List stringList = new ArrayList();          stringList.add("One flew over the cuckoo"s nest");         stringList.add("To kill a muckingbird");         stringList.add("Gone with the wind");          Stream stream = stringList.stream();          boolean allMatch = stream.allMatch((value) -> value.startsWith("One"));         System.out.println(allMatch);      } } 复制代码
  上面的例程我们把流上用的 anyMatch 换成了 allMatch ,结果可想而知会返回 false,因为并不是所有元素都是以 "One" 开头的。noneMatch
  Match 系列里还有一个 noneMatch 方法,顾名思义,如果流中的所有元素都与作为 noneMatch 方法参数的 Predicate 不匹配,则方法会返回 true,否则返回 false。import java.util.ArrayList; import java.util.List; import java.util.stream.Stream;  public class StreamNoneExample {      public static void main(String[] args) {          List stringList = new ArrayList<>();          stringList.add("abc");         stringList.add("def");          Stream stream = stringList.stream();          boolean noneMatch = stream.noneMatch((element) -> {             return "xyz".equals(element);         });          System.out.println("noneMatch = " + noneMatch); //输出 noneMatch = true      } } 复制代码collect
  collect() 方法被调用后,会启动元素的内部迭代,并将流中的元素收集到集合或对象中。import java.util.ArrayList; import java.util.List; import java.util.stream.Collectors; import java.util.stream.Stream;  public class StreamCollectExample {      public static void main(String[] args) {          List stringList = new ArrayList<>();          stringList.add("One flew over the cuckoo"s nest");         stringList.add("To kill a muckingbird");         stringList.add("Gone with the wind");          Stream stream = stringList.stream();          List stringsAsUppercaseList = stream                 .map(value -> value.toUpperCase())                 .collect(Collectors.toList());          System.out.println(stringsAsUppercaseList);      } } 复制代码
  collect() 方法将收集器 -- Collector (java.util.stream.Collector) 作为参数。在上面的示例中,使用的是 Collectors.toList() 返回的 Collector 实现。这个收集器把流中的所有元素收集到一个 List 中去。count
  count() 方法调用后,会启动 Stream 中元素的迭代,并对元素进行计数。import java.util.ArrayList; import java.util.Arrays; import java.util.List; import java.util.stream.Stream;  public class StreamExamples {      public static void main(String[] args) {          List stringList = new ArrayList();          stringList.add("One flew over the cuckoo"s nest");         stringList.add("To kill a muckingbird");         stringList.add("Gone with the wind");          Stream stream = stringList.stream();          long count = stream.flatMap((value) -> {             String[] split = value.split(" ");             return Arrays.asList(split).stream();         }).count();          System.out.println("count = " + count); // count = 14     } } 复制代码
  上面的例程中,首先创建一个字符串 List ,然后获取该 List 的 Stream,为其添加了 flatMap() 和 count() 操作。 count() 方法调用后,流处理将开始迭代 Stream 中的元素,处理过程中字符串元素在 flatMap() 操作中被拆分为单词、合并成一个由单词组成的 Stream,然后在 count() 中进行计数。所以最终打印出的结果是 count = 14。findAny
  findAny() 方法可以从 Stream 中找到单个元素。找到的元素可以来自 Stream 中的任何位置。且它不提供从流中的哪个位置获取元素的保证。import java.util.ArrayList; import java.util.List; import java.util.Optional; import java.util.stream.Stream;  public class StreamFindAnyExample {      public static void main(String[] args) {         List stringList = new ArrayList<>();          stringList.add("one");         stringList.add("two");         stringList.add("three");         stringList.add("one");          Stream stream = stringList.stream();          Optional anyElement = stream.findAny();         if (anyElement.isPresent()) {             System.out.println(anyElement.get());         } else {             System.out.println("not found");         }     } } 复制代码
  findAny() 方法会返回一个 Optional,意味着 Stream 可能为空,因此没有返回任何元素。我们可以通过 Optional 的 isPresent() 方法检查是否找到了元素。
  Optional 类是一个可以为 null 的容器对象。如果值存在则 isPresent() 方法会返回true,调用get()方法会返回容器中的对象,否则抛出异常:NoSuchElementExceptionfindFirst
  findFirst() 方法将查找 Stream 中的第一个元素,跟 findAny() 方法一样,也是返回一个 Optional,我们可以通过 Optional 的 isPresent() 方法检查是否找到了元素。import java.util.ArrayList; import java.util.List; import java.util.Optional; import java.util.stream.Stream;  public class StreamFindFirstExample {      public static void main(String[] args) {         List stringList = new ArrayList<>();          stringList.add("one");         stringList.add("two");         stringList.add("three");         stringList.add("one");          Stream stream = stringList.stream();          Optional anyElement = stream.findFirst();         if (anyElement.isPresent()) {             System.out.println(anyElement.get());         } else {             System.out.println("not found");         }     } } 复制代码forEach
  forEach() 方法我们在介绍 Collection 的迭代时介绍过,当时主要是拿它来迭代 List 的元素。它会启动 Stream 中元素的内部迭代,并将 Consumer (java.util.function.Consumer, 一个函数式接口,上面介绍过) 应用于 Stream 中的每个元素。 注意 forEach() 方法的返回值是 void。import java.util.ArrayList; import java.util.List; import java.util.stream.Stream;  public class StreamExamples {      public static void main(String[] args) {         List stringList = new ArrayList();          stringList.add("one");         stringList.add("two");         stringList.add("three");          Stream stream = stringList.stream();          stream.forEach(System.out::println);     } } 复制代码
  注意,上面例程中 forEach 的参数我们直接用了Lambda 表达式引用方法的简写形式。min
  min() 方法返回 Stream 中的最小元素。哪个元素最小是由传递给 min() 方法的 Comparator 接口实现来确定的。import java.util.ArrayList; import java.util.List; import java.util.Optional; import java.util.stream.Stream;  public class StreamMinExample {      public static void main(String[] args) {         List stringList = new ArrayList<>();          stringList.add("abc");         stringList.add("def");         Stream stream = stringList.stream();          // 作为 min 方法参数的Lambda 表达式可以简写成 String::compareTo         // Optional min = stream.min(String::compareTo);         Optional min = stream.min((val1, val2) -> {             return val1.compareTo(val2);         });          String minString = min.get();          System.out.println(minString); // abc     } } 复制代码
  min() 方法返回的是一个 Optional ,也就是它可能不包含结果。如果为空,直接调用 Optional 的 get() 方法将抛出 异常--NoSuchElementException。比如我们把上面的 List 添加元素的两行代码注释掉后,运行程序就会报Exception in thread "main" java.util.NoSuchElementException: No value present 	at java.util.Optional.get(Optional.java:135) 	at com.example.StreamMinExample.main(StreamMinExample.java:21) 复制代码
  所以最好先用 Optional 的 ifPresent() 判断一下是否包含结果,再调用 get() 获取结果。max
  与 min() 方法相对应,max() 方法会返回 Stream 中的最大元素,max() 方法的参数和返回值跟 min() 方法的也都一样,这里就不再过多阐述了,只需要把上面求最小值的方法替换成求最大值的方法 max() 即可。Optional min = stream.max(String::compareTo); 复制代码reduce
  reduce() 方法,是 Stream 的一个聚合方法,它可以把一个 Stream 的所有元素按照聚合函数聚合成一个结果。reduce()方法接收一个函数式接口 BinaryOperator 的实现,它定义的一个apply()方法,负责把上次累加的结果和本次的元素进行运算,并返回累加的结果。import java.util.ArrayList; import java.util.List; import java.util.Optional; import java.util.stream.Stream;  public class StreamReduceExample {      public static void main(String[] args) {         List stringList = new ArrayList<>();          stringList.add("One flew over the cuckoo"s nest");         stringList.add("To kill a muckingbird");         stringList.add("Gone with the wind");          Stream stream = stringList.stream();          Optional reduced = stream.reduce((value, combinedValue) -> combinedValue + " + " + value);         // 写程序的时候记得别忘了 reduced.ifPresent() 检查结果里是否有值         System.out.println(reduced.get());     } } 复制代码
  reduce() 方法的返回值同样是一个 Optional 类的对象,所以在获取值前别忘了使用 ifPresent() 进行检查。
  streadm 实现了多个版本的reduce() 方法,还有可以直接返回元素类型的版本,比如使用 reduce 实现整型Stream的元素的求和import java.util.ArrayList; import java.util.List;  public class IntegerStreamReduceSum {     public static void main(String[] args) {         List intList = new ArrayList<>();         intList.add(10);         intList.add(9);         intList.add(8);         intList.add(7);         Integer sum = intList.stream().reduce(0, Integer::sum);         System.out.printf("List 求和,总和为%s ", sum);     } } 复制代码
  toArray
  toArray() 方法是一个流的终结操作,它会启动流中元素的内部迭代,并返回一个包含所有元素的 Object 数组。List stringList = new ArrayList();  stringList.add("One flew over the cuckoo"s nest"); stringList.add("To kill a muckingbird"); stringList.add("Gone with the wind");  Stream stream = stringList.stream();  Object[] objects = stream.toArray(); 复制代码
  不过 toArray 还有一个重载方法,允许传入指定类型数组的构造方法,比如我们用 toArray 把流中的元素收集到字符串数组中,可以这么写:String[] strArray = stream.toArray(String[]::new); 复制代码流的拼接
  Java 的Stream 接口包含一个名为 concat() 的静态方法,它可以将两个流连接成一个。import java.util.ArrayList; import java.util.List; import java.util.stream.Collectors; import java.util.stream.Stream;  public class StreamConcatExample {      public static void main(String[] args) {         List stringList = new ArrayList<>();          stringList.add("One flew over the cuckoo"s nest");         stringList.add("To kill a muckingbird");         stringList.add("Gone with the wind");          Stream stream1 = stringList.stream();          List stringList2 = new ArrayList<>();         stringList2.add("Lord of the Rings");         stringList2.add("Planet of the Rats");         stringList2.add("Phantom Menace");          Stream stream2 = stringList2.stream();          Stream concatStream = Stream.concat(stream1, stream2);          List stringsAsUppercaseList = concatStream                 .collect(Collectors.toList());          System.out.println(stringsAsUppercaseList);     } } 复制代码从数组创建流
  上面关于 Stream 的例子我们都是从 Collection 实例的 stream() 方法获取的集合包含的所有元素的流,除了这种方法之外,Java 的 Stream 接口中提供了一个名为 of 的静态方法,能支持从单个,多个对象或者数组对象快速创建流。import java.util.stream.Stream;  public class StreamExamples {      public static void main(String[] args) {         Stream stream1 = Stream.of("one", "two", "three");          Stream stream2 = Stream.of(new String[]{"one", "two"});          System.out.println(stream1.count()); // 输出3         System.out.println(stream2.count()); // 输出2     } } 复制代码总结
  上面我们把 Stream 的两大类操作:流的中间操作、流的终结操作都有哪些方法给大家列举了一遍,让大家对 Stream 能完成的操作有了大致的印象。不过为了讲解这些操作用的都是非常简单的例子,流操作的数据也都是简单类型的,主要的目的是让大家能更快速地理解 Stream 的各种操作应用在数据上后,都有什么效果。
  作者:kevinyan
  链接:https://juejin.cn/post/7156055319490232327

阿里巴巴淘宝首页猜你喜欢信息流推荐长序列建模实践,限时下载本文报告完整版共有18页,非常详尽,值得收藏。本报告下载领取方式详见文末本报告目录大纲如下手淘推荐业务与技术简介LALI粗排中的长序列优化实践ETA端到端的精排长序列建模本报告详细说说那些你喜欢的句子吧每朵云都下落不明,每盏月亮都不知所踪。八月长安暗恋安慰别人头头是道,安慰自己却不知怎么办。所有人都在叫我长大,可是没人叫我快乐。我一生没做什么坏事,为何会这样。张国荣遗书你就是你四某手农村扛把子请注意自己形象互联网直播作为一种新型传播形式迅猛发展的同时,一些直播平台传播色情暴力谣言诈骗等信息,存在平台相关的管理不到位等现象。近日,某手平台用户农村扛把子直播中多次在违规,某手平台仅仅只是金晨时尚大片曝光,每次造型抢尽风头,你最喜欢她哪种风格?夏日逐渐来临,阳炙烤着大地,每天出行都给人一种闷热感,甚至热得让人喘不上来气。这时候应该穿着裙子,步履在海边,听海浪翻滚,感受微风轻抚,就算是梦境也会很惬意!那衣柜里怎么能没有漂亮你别坐这,我不喜欢你隐形霸凌再不当回事,会让孩子性格扭曲你别坐这,我不喜欢你隐形霸凌再不当回事会让孩子性格扭曲在很多人的印象里,孩子的世界都是单纯而美好的,但事实上很多时候,孩子的世界正因为其单纯才更加残忍,甚至是刻毒。前不久的一个晚上尘埃落定!利拉德提出交易,加盟湖人,新的360组合在本赛季利拉德遭受伤病困扰,赛季报销,而开拓者也交易了cj麦科勒姆,让有名的开拓者双枪现在只剩下开拓者单枪,开拓者也只剩下利拉德了,利拉德的要求一直都很明确,他的目标就是总冠军,也狐厂大拷问任嘉伦不喜欢被叫天花板,希望还有进步的空间搜狐娱乐讯(林真心文)近日,由迪丽热巴任嘉伦领衔主演的恰似故人归正在热播。在上部与君初相识中,任嘉伦饰演的鲛人长意因救人上岸,却遭恩将仇报,囚禁后送入万花谷驯服。而下部恰似故人归中酒店水床有何好处?为何深受情侣喜欢?主要有这三点原因酒店对于众多的小伙伴来说,是十分熟悉的。一般有事外出,会选择入住酒店。(此处已添加小程序,请到今日头条客户端查看)而酒店为了迎合大众的需求,不仅仅推出了众多类型的酒店,当然在内部装大s收到结婚礼物却不办婚礼!终于亮相穿衣却太随意,不在乎形象4月12日,大s和具俊晔再次登上热搜,这次是因为韩国知名艺术家送给夫妻俩一幅箱式挂画作为结婚礼物,让大家一度猜测大s和具俊晔即将要举办私人婚礼,不过随后大s的经纪人就直接否认,并且正式签约!周鹏第一次拿到顶薪合同近日广东队外援威姆斯在接受综艺节目篮球大本营采访时表示,想继续留在广东队打球,直到退役!如果真的不在广东,也许会在其他省份球队,我计划留在中国,留在CBA!威姆斯直言想和广东队续约保罗近2场27中21命中率77创季后赛史上后卫连续2场最高命中率直播吧5月3日讯季后赛第二轮G1,太阳战胜独行侠。此役,保罗全场比赛出战28分45秒,13投7中,三分球5中2,3罚全中拿下了19分5板3助1断1帽的数据。数据显示,近2场比赛保罗
原神心海不是美人鱼?从命座到服装充满暗示,原来她是水龙王珊瑚宫心海是原神当中,一位比较重要的角色。她的出现在一定程度上面推动了剧情的发展,其中还会引出后续的剧情。我们都知道当前稻妻的地图已经全部都解锁了,但其实还有一块区域没有出现,那就世界第一美女真人长啥样?当镜头拉近后,这颜值还有啥好说的在娱乐圈中有美女很多,所以说有很多明星有着响亮的称号,让大家都非常印象深刻。可能就只有鞠婧祎的四千年一遇的美女。但是这个称号并不会得到大家的认可。所以今天我来给你介绍一下世界第一美初见惊为天人,再见脸僵如石!这10位女星的脸,到底怎么了近日,张雨绮亮相某时尚红毯,本该惊艳全场的她,这次却让人感到陌生。张雨绮的礼服确实很漂亮,但她僵硬如石的脸却引起了网友的讨论,有些人甚至表示她的脸怎么崩得这么快?除了张雨绮,另一位高清镜头怼脸拍,这5位30的女明星,谁才是真正抗住岁月的美人?年底简直是红毯美人争奇斗艳的黄金时期!女明星们为了美,妆容服装简直一个比一个精致。看看下面这五位当今娱乐圈中最炙手可热的一线女星,谁才是真正抗住岁月的美人?1迪丽热巴作为异域风美女张雨绮模样大变被质疑整容,脸部僵硬不能笑,网友还没恢复好年底了,大家都在忙着开年会和准备工作总结,明星们则是忙着各种晚会红毯。可以说每年到了这个时候,都是观众大饱眼福的机会。先不说工作室放出来的精修图,就算是现场直播,也能够看到女明星们西部乱了,连伦纳德和乔治都要复出,双星带队冲击季后赛如果赛季初跟你说快船是季后赛球队,你肯定会认为这不太实际,毕竟西部的竞争比较激烈。再加上乔治目前休战,快船的战绩也从前列一直跌落,但是肯定不会仅此而已。现在能对太阳勇士湖人篮网雄鹿时隔941天!勇士宣布克莱汤普森回归,首次复出迎战骑士2022年1月9日,勇士队官方发文宣布称,克莱汤普森将在明日对阵骑士一战中复出。克莱汤普森也在社交平台上正式宣布了回归的消息Imback。俱乐部官宣,球员个人亲承,克莱汤普森时隔9巧用传统元素打造服饰,王者荣耀在文化的展示上绝了在我们悠悠久远的传统文化中,有很多能够让人感到无比惊艳的元素或者故事。比如在过年这一个传统中就存在着我们熟悉无比的传统文化,12生肖福娃等等,皆是我们现实生活中十分常见的。只不过随Whereamazinghappens!盘点NBA历史上的那些奇迹Whereamazinghappens,是NBA联盟一句宣传标语,俗话说叫奇迹发生的地方。很多时候我们习惯于把命中绝杀,多少分之后实现大逆转,或者某某又打破了什么记录称之为奇迹,如46岁李小冉的结局,已经注定了李小冉签约欢瑞世纪李小冉在圈内,的确是不可多得的女艺人,她的外形长得非常特别,具有强烈的辨识度,能够驾驭众多类型的角色,让人印象深刻。1月7日,欢瑞世纪官方官宣发文庆祝李小冉签约欢郑凯老婆苗苗放出日常最新生活实录夫唱妇随太友爱了秀恩爱,郑凯老婆苗苗刚刚发布了一个生活视频,把她们家的生活起居晒了出来,她们的姑娘小酸奶正在学走路,夫唱妇随一起和和睦睦在家里过着幸福温馨的生活。让人好羡慕。早上刚起床的照片也遮不VivoiQOO9系列官宣支持三个双,网友就差价格了VivoiQOO9系列虽然1月5日晚上19点30分发布,当时相关配置,包括外观都曝光乐。iQOO9系列继承了iQOO8系列的屏下双控压感双X轴线性马达等,还有封闭式立体双扬声器。V用了这么多年电脑,原来键盘上的F1到F12,每一个都是快捷键关注职场办公,分享实用干货,洞察科技资讯,欢迎来到职场科技范。平时我们的电脑卡住了,都会按下F5刷新,其实电脑键盘上的F1到F12,每一个都是快捷键,下面就来带大家一起来认识一下。暗黑破坏神不朽刷游戏是需要一个标尺的,不停爬层数每次赛季开荒三天,然后测试一下新的套装流派。打顺手了就坐等下个赛季了。暴雪有一个很好的游戏框架,但是为了让玩家刷刷刷,把游戏性全部抹杀了,让游戏变成了工作。马瑟尔的确是难打,以前单当赛博农场搬到艾达星这波劣质乱炖吃了真的没问题?说起赛博农场,看过的小伙伴们大概都会非常印象深刻。作为俄罗斯超硬核特效视频,赛博农场的画面剧情和配乐都很赞,因此在油管爆火入驻B站后,也受到了超多国内小伙伴的欢迎。不过说起来,赛博网曝战神诸神黄昏发售日2022年9月30日上线尽管还未正式踏入2022年,但各大厂商公布的2022游戏发售名单已经让粉丝们急不可耐。对于PS主机玩家而言,最期待的莫过于GT7地平线西部禁域以及战神诸神黄昏了,前两者已有了确切发手游每日榜单(2022年1月8日)每日更新游戏榜单和新鲜资讯,关注我不迷路。关注我的都棒棒哒!今天是2022年1月8日,首先来看看今天的畅销榜单变化今天具体的榜单如下雷霆游戏一念逍遥排名第10。这是一款放置修仙类手另类鱿鱼游戏十三骇人游戏天上星河转,人间帘幕垂。欢迎大家走进星空放映室。相信大家前段时间肯定被大火的韩国剧集鱿鱼游戏刷爆了朋友圈。(没看过的小伙伴可以去抖音自行科普,不建议看完整版,略长,而且是电视剧的形吃鸡不玩游戏后退款4820?玩家等待了3天,收到1个审核结果欢迎诸位小伙伴们来到天哥开讲的和平精英精英小课堂俗话说得好天下没有不散的筵席,这句话无论是放在现实里还是游戏里,都同样如此。以陪伴我们将近4年之久的和平精英为例,老玩家的好友栏里出人们为什么喜欢Steam?我前一段时间,下载过一个微软的著名赛车游戏地平线4(学习版本,你们懂的)!百度网盘下载了10小时,因为大小有110G。是的,现在的游戏就是这么大!现在的玩家要求画面清晰,还希望有旷继韦伯望远镜之后,太空还将出现5大太空神器,都有什么厉害之处图为建造当中的詹姆斯韦伯望远镜随着詹姆斯韦布空间望远镜成功被发射升空之后,接下来太空当中还将出现5大神器,它们就是罗曼空间望远镜大型紫外光学红外探测器LUVOIR等,太空望远镜,就凯酷GZ68三模机械键盘测评十年磨一键,这把键盘真值小配列的机械键盘如今已经越来越火,小巧精致的体积节省桌面空间的特性让不少消费者都为之心动,加之更个性更具质感甚至是可定制设计成为了大家选购键盘的新需求。机械键盘可以说不同品牌不同轴