1 /*
   2  * Copyright (c) 2013 Oracle and/or its affiliates. All rights reserved.
   3  *
   4  * Redistribution and use in source and binary forms, with or without
   5  * modification, are permitted provided that the following conditions
   6  * are met:
   7  *
   8  *   - Redistributions of source code must retain the above copyright
   9  *     notice, this list of conditions and the following disclaimer.
  10  *
  11  *   - Redistributions in binary form must reproduce the above copyright
  12  *     notice, this list of conditions and the following disclaimer in the
  13  *     documentation and/or other materials provided with the distribution.
  14  *
  15  *   - Neither the name of Oracle nor the names of its
  16  *     contributors may be used to endorse or promote products derived
  17  *     from this software without specific prior written permission.
  18  *
  19  * THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS "AS
  20  * IS" AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO,
  21  * THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR
  22  * PURPOSE ARE DISCLAIMED.  IN NO EVENT SHALL THE COPYRIGHT OWNER OR
  23  * CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL,
  24  * EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT LIMITED TO,
  25  * PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, DATA, OR
  26  * PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY THEORY OF
  27  * LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT (INCLUDING
  28  * NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE OF THIS
  29  * SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE.
  30  */
  31 
  32 /*
  33  * This source code is provided to illustrate the usage of a given feature
  34  * or technique and has been deliberately simplified. Additional steps
  35  * required for a production-quality application, such as security checks,
  36  * input validation and proper error handling, might not be present in
  37  * this sample code.
  38  */
  39 package stream;
  40 
  41 import stream.data.Customer;
  42 import stream.data.Order;
  43 import java.util.Comparator;
  44 import java.util.List;
  45 import java.util.stream.Collectors;
  46 
  47 /**
  48  * A demo shows how does Stream's subset works. This demo provides two methods
  49  * which is using substream method on Stream to get subset of the elements. Note
  50  * we can use substream on sorted stream to get top number elements, but we
  51  * can't guarantee the element order if stream is not sorted.
  52  *
  53  * @author hyan
  54  */
  55 public class Subset extends DemoHelper {
  56 
  57     /**
  58      * Returns a List that contains numbers order which customer is from state,
  59      * also execute action on every returned order element. The number must be a
  60      * non-negative digit.
  61      * <p>
  62      *
  63      * @param number integer how many orders are expected to be returned
  64      * @param state state that customer of order belong to
  65      * @return a list contains top number customers that sorted by comp
  66      */
  67     public static List<Order> firstNOrdersFromState(int number,
  68             String state) {
  69         return customers.stream().
  70                 //only take customers from a particular state
  71                 filter(c -> state.equals(c.getRegion())).
  72                 //get orders of those customers
  73                 flatMap(c -> c.getOrders().stream()).
  74                 //get first number of orders
  75                 limit(number).
  76                 //collect to a list
  77                 collect(Collectors.toList());
  78     }
  79 
  80     /**
  81      * Returns a List that contains numbers customer sorted by comp, also
  82      * execute action on every returned customer element. The number must be a
  83      * non-negative digit.
  84      * <p>
  85      *
  86      * @param number integer how many customers are expected to be returned
  87      * @param comp Comparator to compare customer
  88      * @return a list contains top number customers that sorted by comp
  89      */
  90     public static List<Customer> topNCustomer(int number,
  91             Comparator<Customer> comp) {
  92         //We keep result in topN, then we can test it
  93         return customers.stream()
  94 .                //sort customers by comp
  95                 sorted(comp).
  96                 //get first number of orders
  97                 limit(number).
  98                 //collect to a list
  99                 collect(Collectors.toList());
 100     }
 101 }