Java 8改变了我们通常在Java中的编码方式

67 阅读3分钟

Java 8通过引入一些函数式编程的概念,改变了我们通常在Java中的编码方式。它带来了像lambda表达式这样的功能,这些功能产生了新的模式,使Java中的代码更加简洁。在这篇博客中,我们将讨论Java 8的一个功能,即流。java.util.stream包包含了支持对流进行函数式操作的类,如map、filter等。流不是一个存储东西的数据结构,而是一种将数据从源头流向目的地的方式,中间有一些中间操作。让我们先举个例子,这样我们就能快速掌握概念了。

比方说,我们有一个书的集合Collection,其中Book类有两个属性writer和price,我们想获得price的总和,其中writer是 "Deepak kumar"。为了得到这个结果,我们需要做一些类似于--的事情:

int totalPrice = collection.stream()
                      .filter(b -> b.getWriter() == "Deepak kumar")
                      .map(b -> b.getPrice())
                      .sum();

流是一系列的操作,可以是中间操作或终端操作:

  • 中间操作返回一个新的流作为结果,我们可以一个接一个地调用多个中间操作。中间操作在终端操作之前执行。这些类型的操作在本质上总是懒惰的,意味着它们不会被执行,直到需要处理的结果。
  • 终端操作允许我们从剩余的数据中产生一个最终结果。在流上应用这个操作后,意味着流已经消耗了。当终端操作启动时,流管道上的计算就会被执行。

Lambda的属性

  • 它的功能性意味着如果我们在一些数据上应用流,得到一些结果,这并不意味着它将修改源,相反,它将从现有的流创建一个新流。
  • 中间的操作总是懒惰的。
  • 在流的生命周期内,流的元素只被访问一次。

流的创建

private static Book[] arrayOfBook = {
    new Book("Ravi sharma", 100.0), 
    new Book("Deepak kumar", 240.0), 
    new Book("Amit Tyagi", 343.0),
    new Book("Chirag Gupta", 143.0)
};

Stream.of(arrayOfBook);

我们也可以直接使用stream()方法来从列表中转换为流:

private static List<Book> bookList = Arrays.asList(arrayOfBook);
empList.stream();

流的操作

  • filter: 它产生一个新的流,包含通过谓词的元素,即
Integer[] bookPrice = { 100, 200, 300, 44 };
    
    List<Integer> totalPrice = Stream.of(bookPrice)
      .filter(e -> e >= 200)
      .collect(Collectors.toList());

结果 - { 200, 300 }

  • map:它产生一个新的流,其中包含通过谓词的元素。它在对原始流的每个元素应用一个函数后产生一个新的流。
List number = Arrays.asList(2,3,4,5)
              .stream()
              .map(s->s+s)
              .collect(Collectors.toList());

结果。{ 4, 6, 8, 10 }

  • forEach。 它是最简单的操作,看起来和map一样,但它是一个终端操作,这意味着应用这个操作后,我们不能使用任何其他操作。
  • flatMap: 它是flat和map函数的组合。
List<List<Integer>> listOfList = Arrays.asList(
                                         Arrays.asList(1,2,3),
                                         Arrays.asList(4,2),
                                         Arrays.asList(1,3));
List<Integer> list = listOfList.stream() 
                                    .flatMap(list -> list.stream())
                                    .collect(Collectors.toList()); 

结果 : { 1, 2, 3, 4, 2, 1, 3 }

  • collect: collect函数是一个终端操作,将流转换为一些其他的集合或实体,即在本例中我们将把流转换为列表。
List<Integer> IntSet = Stream.of(1,2,3,4,5)
              .map(x -> x+1)
              .collect(Collectors.toList());

结果:List(2, 3, 4, 5, 6 )

Scala FutureScala Future