Parallel programming and cheap multi core processors make functional concepts more popular. That is the reason why object oriented languages take over functional concepts. Hence Java 8 added lambda expressions and streams. Now it is possible to use behaviour as data in form of higher order functions. Streams make it possible to declaratively process data in a sequential or parallel manner. This work aims at showing advantages and disadvantages of these new concepts. With help of examples and decompilation into JVM byte code, we want to analyze the changes and see how other languages implement these concepts. We try to compare the runtime performance of old and new concepts via benchmarks using the tool JMH. There we will answer when to use parallel streams, if the IBM J9 is faster than the HotSpot JVM and if Java or Scala is faster in terms of parallel computations. In looking at the functional concepts of Haskell we want to find missing concepts in Java and present some alternatives. Lambda expressions and streams need less code and are more readable and maintainable. On the other side, exception handling and debugging is more complicated. Lambdas are translated at runtime with JVMs method call invokedynamic. No class files are generated and Java can optimize their translation strategy in future versions, although Java has backwards compatibility. Our benchmarks show that sequential streams are slightly slower than loops. Parallel streams can achieve performance improvements, but you should only use them with an appropriate stream source, enough elements and complex computations. Java is faster than Scala because it prevents boxing and unboxing with help of specialized streams for primitive data types. Java still needs to catch up on functional concepts. It has monads and supports lazy evaluation on streams. On the other side, support of algebraic data types and pattern matching is insufficient, but it is possible to simulate them via lambda expressions.