• Post Reply Bookmark Topic Watch Topic
  • New Topic
programming forums Java Mobile Certification Databases Caching Books Engineering Micro Controllers OS Languages Paradigms IDEs Build Tools Frameworks Application Servers Open Source This Site Careers Other all forums
this forum made possible by our volunteer staff, including ...
Marshals:
  • Campbell Ritchie
  • Liutauras Vilda
  • Tim Cooke
  • Jeanne Boyarsky
  • Bear Bibeault
Sheriffs:
  • Knute Snortum
  • paul wheaton
  • Devaka Cooray
Saloon Keepers:
  • Tim Moores
  • Stephan van Hulst
  • Ron McLeod
  • Piet Souris
  • Ganesh Patekar
Bartenders:
  • Tim Holloway
  • Carey Brown
  • salvin francis

Errata in OCP study guide ? (Sybex)

 
Greenhorn
Posts: 1
  • Mark post as helpful
  • send pies
  • Quote
  • Report post to moderator
Hello,
On page 204 about streams, table 4.5 says that this is non destructive :


It seems to me as destructive, since the stream can no longer be used afterwards.
Maybe this one would be non destructive :


cheers
 
Marshal
Posts: 65365
248
  • Mark post as helpful
  • send pies
  • Quote
  • Report post to moderator
Welcome to the Ranch

Please provide more details of the book, including authors' names.
What is the definition of a non‑destructive operation?
What do you think would happen if you execute your second code block?
 
Sheriff
Posts: 13675
226
Mac Android IntelliJ IDE Eclipse IDE Spring Debian Java Ubuntu Linux
  • Mark post as helpful
  • send pies
  • Quote
  • Report post to moderator
I believe you're right, since count() is a terminating operation
 
author & internet detective
Posts: 39433
768
Eclipse IDE VI Editor Java
  • Mark post as helpful
  • send pies
  • Quote
  • Report post to moderator
I'm pretty sure that's my book as this is a question we get periodically. The point we are trying to make is that the printing (peek operation) is not destructive.

Yes, count() is a terminal operation. You need a terminal operation to do anything. But printing isn't 'using" up the stream. Counting is.
 
Junilu Lacar
Sheriff
Posts: 13675
226
Mac Android IntelliJ IDE Eclipse IDE Spring Debian Java Ubuntu Linux
  • Mark post as helpful
  • send pies
  • Quote
  • Report post to moderator
I don't think "destructive" and "non-destructive" are even the right terms to use here. The API documentation refers to these as intermediate and terminal operations. Even an intermediate operation like peek consumes the stream it operates on and produces a new stream so I'm not sure what we're referring to here as being "not destroyed" or otherwise.

For example, you can't do this:

Because that would produce this exception:
java.lang.IllegalStateException: stream has already been operated upon or closed

Also, starting from Java 9 onwards, the line in question will not even produce any output (at least not when I ran it using different versions of the JDK on my Mac).
 
Junilu Lacar
Sheriff
Posts: 13675
226
Mac Android IntelliJ IDE Eclipse IDE Spring Debian Java Ubuntu Linux
  • Mark post as helpful
  • send pies
  • Quote
  • Report post to moderator
Starting from Java 9, the API documentation for Stream.count() has this note (emphasis on last line mine):

API Note:
An implementation may choose to not execute the stream pipeline (either sequentially or in parallel) if it is capable of computing the count directly from the stream source. In such cases no source elements will be traversed and no intermediate operations will be evaluated. Behavioral parameters with side-effects, which are strongly discouraged except for harmless cases such as debugging, may be affected. For example, consider the following stream:

    List<String> l = Arrays.asList("A", "B", "C", "D");
    long count = l.stream().peek(System.out::println).count();


The number of elements covered by the stream source, a List, is known and the intermediate operation, peek, does not inject into or remove elements from the stream (as may be the case for flatMap or filter operations). Thus the count is the size of the List and there is no need to execute the pipeline and, as a side-effect, print out the list elements.

 
Campbell Ritchie
Marshal
Posts: 65365
248
  • Mark post as helpful
  • send pies
  • Quote
  • Report post to moderator
That actually means its behaviour is not strictly defined, and it differs in Java9 from Java8.
 
Campbell Ritchie
Marshal
Posts: 65365
248
  • Mark post as helpful
  • send pies
  • Quote
  • Report post to moderator
I had a quick scan through Stream's methods and count() appears to be the only method where the API note suggests any such difference in behaviour.
 
Why does your bag say "bombs"? The reason I ask is that my bag says "tiny ads" and it has stuff like this:
create, convert, edit or print DOC and DOCX in Java
https://products.aspose.com/words/java
  • Post Reply Bookmark Topic Watch Topic
  • New Topic
Boost this thread!