Welcome to the Treehouse Community
Want to collaborate on code errors? Have bugs you need feedback on? Looking for an extra set of eyes on your latest project? Get support with fellow developers, designers, and programmers of all backgrounds and skill levels here with the Treehouse Community! While you're at it, check out some resources Treehouse students have shared here.
Looking to learn something new?
Treehouse offers a seven day free trial for new students. Get access to thousands of hours of content and join thousands of Treehouse students and alumni in the community today.
Start your free trialTest Test
21,581 PointsJava 8 alternative for findByName method (lambdas and streams)
Since Intellij Idea can run with Java 8 (lambdas and aggregate operations), does it make sense to use them as a better choice than for-each loop? It works the same, but it does not iterate all items in the List -> saves time and battery.
Here is the method for Java8:
public Gif findByNameJava8 (String name) {
return ALL_GIFS
.stream().
.filter(e -> e.getName().equals(name))
.findFirst().orElse(null);
}
Prerequisites: 1) set sourceCompatibility = 1.8 in your build.gradle file; 2) set language level to 8 and SDK to 1.8 (Ctrl+Shift+Alt+S on Windows, tabs Project and Module (Source)) 3) You Java version (JDK) must be not lower than 1.8.
PS: official Java documentation about for-each loop and aggregate operations: https://docs.oracle.com/javase/tutorial/collections/streams/index.html
Jeremiah Shore
31,168 PointsBrandon Adams check your build.gradle. It can default sourceCompatibility to 1.5 when we are using 1.8. Make sure you do a Gradle project refresh after.
Boban Talevski
24,793 PointsJust a virtual +1 for this (since I can't upvote your post)!
I did the same thing as well (my implementation is exactly the same as yours) and nice to see that someone else thought of it, by which I could also confirm I was on the right track thinking this was a good spot for testing my Java 8 skills :).
I think it should've been done this way in the course, just so we can get additional practice on Java 8 features and get a "hey, this is a nice spot to use a Java 8 feature" moment instead of doing it the old school way.
3 Answers
Daniel Santos
34,969 PointsHi Konstankin,
This is really nice. When he implemented the enhancement for loop first thing I thought was, I can use a lambda here. You mentioned something interesting, so with the stream().filter().findFirst() it does not go through the whole list?
How does that happen? I mean, like if the element is the last one, what would be the behaviour?
-Dan
Jeremiah Shore
31,168 PointsCheck out the JavaDoc link he shared, it's well worth reading.
In particular, see the section called "Differences Between Aggregate Operations and Iterators". Apparently, aggregate operations can use Parallelism because streams use internal iteration, as opposed to to the means defined by the Iterator interface which collections use. This is all new to me, except lambdas in general, and now the benefit of streams is a lot clearer!
Thanks @konstantinkochetov for sharing!
Ilja Torikka
2,178 PointsIt's the first one, which intermediate operation filter(e -> e.getName().equals(name)) finds.
Florian Tรถnjes
Full Stack JavaScript Techdegree Graduate 50,856 PointsThanks Konstantin!
Brandon Adams
10,325 PointsBrandon Adams
10,325 PointsI did all the prereqs but ItelliJ still thinks I'm using 1.5, can't do lambdas and I'm having errors with LocalDate too. Any ideas what could be preventing 1.8 from being used?