A stream is a sequence of objects that supports various methods which can be pipelined to produce the desired result. Slice of a Stream means a stream of elements that exists in a specified limit, from the original stream.
Examples:
Input: [11, 12, 13, 14, 15, 16, 17, 18, 19, 20]
Output: [15, 16, 17, 18, 19]
Explanation: The output contains a slice of the stream from index 4 to 8.Input: [1, 2, 3, 4, 5, 6, 7, 8, 9]
Output: [2, 3, 4]
Explanation: The output contains a slice of the stream from index 1 to 3.
Below are the methods to remove nulls from a List in Java:
- Using skip() and limit(): Stream API in Java provides skip() method which is used to discard the other non-required elements from the stream. It also provides limit() function which is applied to fetch the new stream with the specified index as limit, in the encountered order.
Algorithm:
- Get the Stream to be sliced.
- Get the From and To index to be sliced from Stream as StartIndex and EndIndex
- Call skip() method to specify the number of elements to be skipped before the starting index as skip(startIndex)
- Call limit() method to specify the number of elements, from the stream, that should be limited as limit(endIndex – startIndex + 1)
- Return the Sliced Stream
// Java program to get slice of a stream using
// Stream skip() and limit()
import
java.util.*;
import
java.util.stream.Stream;
Â
Âclass
GFG {
Â
ÂÂ Â Â Â
// Generic function to get Slice of a
   Â
// Stream from startIndex to endIndex
   Â
public
static
<T> Stream<T>
   Â
getSliceOfStream(Stream<T> stream,
int
startIndex,Â
                                         Â
int
endIndex)
   Â
{
       Â
return
stream
           Â
// specify the number of elements to skip
           Â
.skip(startIndex)
Â
ÂÂ Â Â Â Â Â Â Â Â Â Â Â
// specify the no. of elements the stream
           Â
// that should be limited
           Â
.limit(endIndex - startIndex +
1
);
   Â
}
   Â
public
static
void
main(String[] args)
   Â
{
Â
ÂÂ Â Â Â Â Â Â Â
// Create a new List with values 11 - 20
       Â
List<Integer> list =
new
ArrayList<>();
       Â
for
(
int
i =
11
; i <=
20
; i++)
           Â
list.add(i);
Â
ÂÂ Â Â Â Â Â Â Â
// Create stream from list
       Â
Stream<Integer> intStream = list.stream();
Â
ÂÂ Â Â Â Â Â Â Â
// Print the stream
       Â
System.out.println(
"List: "
+ list);
Â
ÂÂ Â Â Â Â Â Â Â
// Get Slice of Stream
       Â
// containing of elements from the 4th index to 8th
       Â
Stream<Integer>
           Â
sliceOfIntStream = getSliceOfStream(intStream,
4
,
8
);
Â
ÂÂ Â Â Â Â Â Â Â
// Print the slice
       Â
System.out.println(
"\nSlice of Stream:"
);
       Â
sliceOfIntStream.forEach(System.out::println);
   Â
}
}
Output:List: [11, 12, 13, 14, 15, 16, 17, 18, 19, 20] Slice of Stream: 15 16 17 18 19
- Using Collectors along with skip() and limit(): In this method, the Stream is converted to List and then a function of a collector to get sub-list of desired elements is used and the sub-list id converted back to a stream using stream.collect(Collectors.collectingAndThen()).
Algorithm:
- Get the Stream to be sliced.
- Get the From and To index to be sliced from Stream as StartIndex and EndIndex
- Using Collectors.collectingAndThen,
- Convert the Stream to List using Collectors.toList()
- Obtain the Stream from the List as list.stream()
- Call skip() method to specify the number of elements to be skipped before the starting index as skip(startIndex)
- Call limit() method to specify the number of elements, from the stream, that should be limited as limit(endIndex – startIndex + 1)
- Collect the sliced list stream using stream.collect()
- Return the Sliced Stream
// Java program to get slice of a stream using
// Collection skip() and limit()
import
java.util.*;
import
java.util.stream.*;
Â
Âclass
GFG {
Â
ÂÂ Â Â Â
// Generic function to get Slice of a
   Â
// Stream from startIndex to endIndex
   Â
public
static
<T> Stream<T>
   Â
getSliceOfStream(Stream<T> stream,
int
startIndex,
int
endIndex)
   Â
{
       Â
return
stream.collect(Collectors.collectingAndThen(
Â
ÂÂ Â Â Â Â Â Â Â Â Â Â Â
// 1st argument
           Â
// Convert the stream to list
           Â
Collectors.toList(),
Â
ÂÂ Â Â Â Â Â Â Â Â Â Â Â
// 2nd argument
           Â
list -> list.stream()
                       Â
// specify the number of elements to skip
                       Â
.skip(startIndex)
Â
ÂÂ Â Â Â Â Â Â Â Â Â Â Â Â Â Â Â Â Â Â Â Â Â Â Â
// specify the no. of elements the stream
                       Â
// that should be limited
                       Â
.limit(endIndex - startIndex +
1
)));
   Â
}
   Â
public
static
void
main(String[] args)
   Â
{
Â
ÂÂ Â Â Â Â Â Â Â
// Create a new List with values 11 - 20
       Â
List<Integer> list =
new
ArrayList<>();
       Â
for
(
int
i =
11
; i <=
20
; i++)
           Â
list.add(i);
Â
ÂÂ Â Â Â Â Â Â Â
// Create stream from list
       Â
Stream<Integer> intStream = list.stream();
Â
ÂÂ Â Â Â Â Â Â Â
// Print the stream
       Â
System.out.println(
"List: "
+ list);
Â
ÂÂ Â Â Â Â Â Â Â
// Get Slice of Stream
       Â
// containing of elements from the 4th index to 8th
       Â
Stream<Integer>
           Â
sliceOfIntStream = getSliceOfStream(intStream,
4
,
8
);
Â
ÂÂ Â Â Â Â Â Â Â
// Print the slice
       Â
System.out.println(
"\nSlice of Stream:"
);
       Â
sliceOfIntStream.forEach(System.out::println);
   Â
}
}
Output:List: [11, 12, 13, 14, 15, 16, 17, 18, 19, 20] Slice of Stream: 15 16 17 18 19
- Fetching a SubList: This method involves converting a Stream into a List. Now this list is used to fetch a required subList from it between the specified index. And finally, this subList is converted back to Stream.
Algorithm:
- Get the Stream to be sliced.
- Get the From and To index to be sliced from Stream as StartIndex and EndIndex
- Convert the Stream to List using Collectors.toList() and then collect it using stream.collect()
- Fetch the subList from the collected List with the startIndex and endIndex+1 as the limit using subList(startIndex, endIndex + 1)
- Convert the subList back to stream using stream()
- Return the Sliced Stream
// Java program to get slice of a stream by
// fetching a sublist
import
java.util.*;
import
java.util.stream.*;
Â
Âclass
GFG {
Â
ÂÂ Â Â Â
// Generic function to get Slice of a
   Â
// Stream from startIndex to endIndex
   Â
public
static
<T> Stream<T>
   Â
getSliceOfStream(Stream<T> stream,
int
startIndex,
int
endIndex)
   Â
{
       Â
return
stream
           Â
// Convert the stream to list
           Â
.collect(Collectors.toList())
Â
ÂÂ Â Â Â Â Â Â Â Â Â Â Â
// Fetch the subList between the specified index
           Â
.subList(startIndex, endIndex +
1
)
Â
ÂÂ Â Â Â Â Â Â Â Â Â Â Â
// Convert the subList to stream
           Â
.stream();
   Â
}
Â
ÂÂ Â Â Â
public
static
void
main(String[] args)
   Â
{
Â
ÂÂ Â Â Â Â Â Â Â
// Create a new List with values 11 - 20
       Â
List<Integer> list =
new
ArrayList<>();
       Â
for
(
int
i =
11
; i <=
20
; i++)
           Â
list.add(i);
Â
ÂÂ Â Â Â Â Â Â Â
// Create stream from list
       Â
Stream<Integer> intStream = list.stream();
Â
ÂÂ Â Â Â Â Â Â Â
// Print the stream
       Â
System.out.println(
"List: "
+ list);
Â
ÂÂ Â Â Â Â Â Â Â
// Get Slice of Stream
       Â
// containing of elements from the 4th index to 8th
       Â
Stream<Integer>
           Â
sliceOfIntStream = getSliceOfStream(intStream,
4
,
8
);
Â
ÂÂ Â Â Â Â Â Â Â
// Print the slice
       Â
System.out.println(
"\nSlice of Stream:"
);
       Â
sliceOfIntStream.forEach(System.out::println);
   Â
}
}
Output:List: [11, 12, 13, 14, 15, 16, 17, 18, 19, 20] Slice of Stream: 15 16 17 18 19