SlideShare ist ein Scribd-Unternehmen logo
1 von 61
Downloaden Sie, um offline zu lesen
Automatic Migration of LegacyAutomatic Migration of Legacy
Java Method ImplementationsJava Method Implementations
to Interfacesto Interfaces
Work in ProgressWork in Progress
Raffi Khatchadourian
Computer Systems Technology
New York City College of Technology
City University of New York
Department of Computer Science
College of Staten Island
City University of New York
June 12, 2015
Based on slides by Duarte Duarte, Eduardo Martins, Miguel Marques and
Ruben Cordeiro and Horstmann, Cay S. (2014-01-10). Java SE8 for the
Really Impatient: A Short Course on the Basics (Java Series). Pearson
Education.
Some demonstration code at: .http://github.com/khatchad/java8-demo
Some HistorySome History
Java was invented in the 90's as an Object-Oriented language.
Largest change was in ~2005 with Java 5.
Generics.
Enhanced for loops.
Annotations.
Type-safe enumerations.
Concurrency enhancements (AtomicInteger).
Java 8 is MassiveJava 8 is Massive
10 years later, Java 8 is packed with new features.
Core changes are to incorporate functional language features.
Functional LanguagesFunctional Languages
Declarative ("what not how").
The only state is held in parameters.
Traditionally popular in academia and AI.
Well-suited for event-driven/concurrent ("reactive") programs.
Lambda ExpressionsLambda Expressions
A block of code that you can pass around so it can be
executed later, once or multiple times.
Anonymous methods.
Reduce verbosity caused by anonymous classes.
How are they different from Java methods?
LambdasLambdas
(int x, int y) -> x + y
() -> 42
(String s) -> {System.out.println(s);}
() -> {return "Hello";}
LambdasLambdas
ExamplesExamples
BeforeBefore
Button btn = new Button();
final PrintStream pStream = ...;
btn.setOnAction(new EventHandler<ActionEvent>() {
@Override
public void handle(ActionEvent e) {
pStream.println("Button Clicked!");
}
});
AfterAfter
Button btn = new Button();
final PrintStream pStream = ...;
btn.setOnAction(e -> pStream.println("Button Clicked!"));
LambdasLambdas
ExamplesExamples
List<String> strs = ...;
Collections.sort(strs, (s1, s2) ->
Integer.compare(s1.length(), s2.length()));
new Thread(() -> {
connectToService();
sendNotification();
}).start();
Functional InterfacesFunctional Interfaces
Single Abstract Method Type
Functional InterfacesFunctional Interfaces
ExampleExample
@FunctionalInterface
public interface Runnable {
public void run();
}
Runnable r = () -> System.out.println("Hello World!");
@FunctionalInterface:
May be omitted.
Generates an error when there is more than one abstract method.
Can store a lambda expression in a variable.
Can return a lambda expression.
java.util.functionjava.util.function
Predicate<T> - a boolean-valued property of an object
Consumer<T> - an action to be performed on an object
Function<T,R> - a function transforming a T to a R
Supplier<T> - provide an instance of a T (such as a factory)
UnaryOperator<T> - a function from T to T
BinaryOperator<T> - a function from (T,T) to T
Method ReferencesMethod References
Treating an existing method as an instance of a
Functional Interface
Method ReferencesMethod References
ExamplesExamples
class Person {
private String name;
private int age;
public int getAge() {return this.age;}
public String getName() {return this.name;}
}
Person[] people = ...;
Comparator<Person> byName = Comparator.comparing(Person::getName);
Arrays.sort(people, byName);
Method ReferencesMethod References
Kinds of method referencesKinds of method references
A static method (ClassName::methName)
An instance method of a particular object
(instanceRef::methName)
A super method of a particular object (super::methName)
An instance method of an arbitrary object of a particular type
(ClassName::methName)
A class constructor reference (ClassName::new)
An array constructor reference (TypeName[]::new)
Method ReferencesMethod References
More ExamplesMore Examples
Consumer<Integer> b1 = System::exit;
Consumer<String[]> b2 = Arrays::sort;
Consumer<String[]> b3 = MyProgram::main;
Default MethodsDefault Methods
Add default behaviors to interfaces
Why default methods?Why default methods?
Java 8 has lambda expressions. We want to start using them:
List<?> list = ...
list.forEach(...); // lambda code goes here
There's a problemThere's a problem
The forEach method isn’t declared by java.util.List nor the
java.util.Collection interface because doing so would break
existing implementations.
Default MethodsDefault Methods
We have lambdas, but we can't force new behaviors into current
libraries.
Solution: default methods.
Default MethodsDefault Methods
Traditionally, interfaces can't have method definitions (just
declarations).
Default methods supply default implementations of interface
methods.
By default, implementers will receive this implementation if they don't
provide their own.
ExamplesExamples
Example 1Example 1
BasicsBasics
public interface A {
default void foo() {
System.out.println("Calling A.foo()");
}
}
public class Clazz implements A {
}
Client codeClient code
Clazz clazz = new Clazz();
clazz.foo();
OutputOutput
"Calling A.foo()"
Example 2Example 2
Getting messyGetting messy
public interface A {
default void foo(){
System.out.println("Calling A.foo()");
}
}
public interface B {
default void foo(){
System.out.println("Calling B.foo()");
}
}
public class Clazz implements A, B {
}
Does this code compile?
Of course not (Java is not C++)!
class Clazz inherits defaults for foo() from both types
A and B
How do we fix it?
Option A:
public class Clazz implements A, B {
public void foo(){/* ... */}
}
We resolve it manually by overriding the conflicting method.
Option B:
public class Clazz implements A, B {
public void foo(){
A.super.foo(); // or B.super.foo()
}
}
We call the default implementation of method foo() from either
interface A or B instead of implementing our own.
Going back to the example of forEach method, how can we force it's
default implementation on all of the iterable collections?
Let's take a look at the Java UML for all the iterable Collections:
To add a default behavior to all the iterable collections, a default
forEach method was added to the Iterable<E> interface.
We can find its default implementation in java.lang.Iterable
interface:
@FunctionalInterface
public interface Iterable {
Iterator iterator();
default void forEach(Consumer<? super T> action) {
Objects.requireNonNull(action);
for (T t : this) {
action.accept(t);
}
}
}
The forEach method takes a java.util.function.Consumer
functional interface type as a parameter, which enables us to pass in a
lambda or a method reference as follows:
List<?> list = ...
list.forEach(System.out::println);
This is also valid for Sets and Queues, for example, since both classes
implement the Iterable interface.
Specific collections, e.g., UnmodifiableCollection, may override
the default implementation.
SummarySummary
Default methods can be seen as a bridge between lambdas and JDK
libraries.
Can be used in interfaces to provide default implementations of
otherwise abstract methods.
Clients can optionally implement (override) them.
Can eliminate the need for skeletal implementators like
.
Can eliminate the need for utility classes like .
static methods are now also allowed in interfaces.
AbstractCollection
Collections
Open ProblemsOpen Problems
Can eliminate the need for skeletal implementators like
.AbstractCollection
MotivationMotivation
Two cases:
1. Complete migration of skeletal implementation to interface.
Makes type hierarchy less complicated.
One less type.
Makes interfaces easier to implement.
No global analysis required to find skeletal implemention.
Makes interfaces easier to maintain.
No simultaneous modifications between interface and skeletal
implementation required.
2. Partial migration of skeletal implementation to interface.
Possibly makes interfaces easier to implement.
All implementations may not need to extended the skeletal
implementation.
Possibly makes interfaces easier to maintain.
Possibily less simultaneous modifications between interface
and skeletal implementation required.
Open ProblemsOpen Problems
Can eliminate the need for utility classes like .Collections
MotivationMotivation
Two cases:
1. Complete migration of utility classes to interface(s).
Makes type hierarchy less complicated.
One less type.
Makes interfaces easier to use.
No global analysis required to find utility class.
Only methods applicable to the interface are present.
Can call methods like instance methods (a.b() instead of b(a)).
IDE will show applicable methods.
2. Partial migration of utility classes to interface(s).
Still makes interfaces easier to use for certain methods.
Can avoid global analysis in some cases.
Open ProblemsOpen Problems
Can eliminate the need for skeletal implementators like
.AbstractCollection
Can we automate this?Can we automate this?
1. How do we determine if an interface
implementor is "skeletal?"
2. What is the criteria for an instance method to be
converted to a default method?
3. What if there is a hierarchy of skeletal
implementors, e.g., AbstractCollection,
AbstractList?
4. How do we preserve semantics?
5. What client changes are necessary?
Skeletal ImplementatorsSkeletal Implementators
Abstract classes that provide skeletal implementations
for interfaces.
Let's take a look at the Java UML for AbstractCollection:
Open ProblemsOpen Problems
Can eliminate the need for utility classes like .Collections
Can we automate this?Can we automate this?
1. How do we determine if a class is a
"utility" class?
2. What is the criteria for a static method to
be:
Converted to an instance method?
Moved to an interface?
3. How do we preserve semantics?
4. What client changes are necessary?
Let's start with question #2 for both the previous slides. There seems to
be a few cases here:
# From a class To an interface
1. instance method default method
2. static method default method
3. static method static method
Is case #3 a simple move method refactoring? (Yes
but to where? -- more later)
Why Is This Complicated?Why Is This Complicated?
Case #1 corresponds to moving a skeletal implementation to an
interface.
# From a class To an interface
1. instance method default method
For case #1, can we not simply use a move method refactoring?
No. The inherent problem is that, unlike classes,
interfaces may extend multiple interfaces. As such, we
now have a kind of multiple inheritance problem to
deal with.
Case #1Case #1
Some (perhaps) Obvious PreconditionsSome (perhaps) Obvious Preconditions
Source instance method must not access any instance fields.
Interfaces may not have instance fields.
Can't currently have a default method in the target interface with
the same signature.
Can't modify target method's visibility.
Some Obvious TasksSome Obvious Tasks
Must replace the target method in the interface (add a body to it).
Must add the default keyword.
Must remove any @Override annotations (it's top-level now).
If nothing left in abstract class, remove it?
Need to deal with documentation.
Case #1Case #1
Some Not-so-obvious PreconditionsSome Not-so-obvious Preconditions
Suppose we have the following situation:
interface I {
void m();
}
interface J {
void m();
}
abstract class A implements I, J {
@Override
void m() {...}
}
Here, A provides a partial implementation of I.m(), which also happens
to be declared as part of interface J.
Case #1Case #1
Some Not-so-obvious PreconditionsSome Not-so-obvious Preconditions
Now, we pull up A.m() to be a default method of I:
interface I {
default void m() {..} //was void m();
}
interface J {
void m(); //stays the same.
}
abstract class A implements I, J {
//now empty, was: void m() {...}
}
We now have a compile-time error in A because A needs to declare
which m() it inherits.
In general, inheritance hierarchies may be large and complicated.
Other preconditions may also exist (work in progress).
Why Is This Complicated?Why Is This Complicated?
Case #3 corresponds to moving a static utility method to an interface.
# From a class To an interface
3. static method default method
For case #1, can we not simply use a move method refactoring?
No and for a few reasons:
Method signature must change (not only removing
the static keyword).
Client code must change from static method calls
to instance method calls.
Which parameter is to be the receiver of the call?
What is the target interface?
Case #3Case #3
Some (perhaps) Obvious PreconditionsSome (perhaps) Obvious Preconditions
The source method vaciously doesn't access instance fields.
Default version of the source method can't already exist in the target
interface.
Some Obvious TasksSome Obvious Tasks
Must add the default keyword.
If nothing left in utility class, remove it?
Need to deal with documentation.
Case #3Case #3
Some Not-so-obvious PreconditionsSome Not-so-obvious Preconditions
/**
* Copies all of the elements from one list into another.
*/
public static <T> void Collections.copy(List<? super T> dest, List<? extends T
Should this be a static or default method?
Call it as Collections.copy(l2, l1) or l2.copy(l1)?
It's probably more natural to leave it as static .
Also, we can't express the generics if it was refactored to a
default method.
The generics here express the relationship between the two
lists in a single method.
We can't do if it was default.
Case #3Case #3
You may be tempted to move the copy method to a default method in
List, but since the method uses generics and expresses a very distinct
relationship between two two Lists, you will lose the type safety
offered by the generics. For example, suppose you have:
List<String> l1;
List<String> l2;
Now, you copy the contents of l2 into l1:
Collections.copy(l1, l2);
If l2 is, instead, List<Integer>, you will receive a compile-time error.
However, if copy was a default method of, say, the List interface, we
would have something like this:
l1.copy(l2)
Making l2 a List<Integer> would not result in a compile-time error.
Case #3Case #3
This method should actually move to the List interface and remain
static, but:
What is there's another method named copy in the List interface?
List is an interface, and interfaces can extend other interfaces.
What if there's another method with the same signature in the
hierarchy?
Case #4Case #4
Determining the target interface for caseDetermining the target interface for case
#4#4
We can apply a heuristic: take the least common interface of the
parameters. For example:
public static void m(I1 p1, I2 p2, ..., In pn);
Here, we would take the closest sibling to I1, I2, ..., In as the target
interface. Otherwise, we normally take the first parameter if it's an
interface.
java.util.streamjava.util.stream
filter/map/reduce for Java
java.util.streamjava.util.stream
List<Student> students = ...;
Stream stream = students.stream(); // sequential version
// parallel version
Stream parallelStream = students.parallelStream();
traversed once
infinite
lazy
java.util.streamjava.util.stream
Stream sourcesStream sources
CollectionsCollections
Set<Student> set = new LinkedHashSet<>();
Stream<Student> stream = set.stream();
GeneratorsGenerators
Random random = new Random();
Stream<Integer> randomNumbers = Stream.generate(random::nextInt);
// or simply ...
IntStream moreRandomNumbers = random.ints();
From other streamsFrom other streams
Stream newStream = Stream.concat(stream, randomNumbers);
java.util.streamjava.util.stream
Intermediate operationsIntermediate operations
.filter - excludes all elements that don’t match a Predicate
.map - perform transformation of elements using a Function
.flatMap - transform each element into zero or more elements by
way of another Stream
.peek - performs some action on each element
.distinct - excludes all duplicate elements (equals())
.sorted - orderered elements (Comparator)
.limit - maximum number of elements
.substream - range (by index) of elements
List<Person> persons = ...;
Stream<Person> tenPersonsOver18 = persons.stream()
.filter(p -> p.getAge() > 18)
.limit(10);
java.util.streamjava.util.stream
Terminating operationsTerminating operations
1. Obtain a stream from some sources
2. Perform one or more intermidate operations
3. Perform one terminal operation
reducers like reduce(), count(), findAny(), findFirst()
collectors (collect())
forEach
iterators
List<Person> persons = ..;
List<Student> students = persons.stream()
.filter(p -> p.getAge() > 18)
.map(Student::new)
.collect(Collectors.toList());
java.util.streamjava.util.stream
Parallel & SequentialParallel & Sequential
List<Person> persons = ..;
List<Student> students = persons.stream()
.parallel()
.filter(p -> p.getAge() > 18)
.sequential()
.map(Student::new)
.collect(Collectors.toCollection(ArrayList::new));
References & Documentation &References & Documentation &
Interesting LinksInteresting Links
Horstmann, Cay S. (2014-01-10). Java SE8 for the Really Impatient: A Short Cour
Basics (Java Series). Pearson Education.
http://download.java.net/jdk8/docs/
http://download.java.net/jdk8/docs/api/
https://blogs.oracle.com/thejavatutorials/entry/jdk_8_documentation_develope
http://docs.oracle.com/javase/tutorial/java/javaOO/lambdaexpressions.html
Questions?Questions?

Weitere ähnliche Inhalte

Was ist angesagt?

Defaultification Refactoring: A Tool for Automatically Converting Java Method...
Defaultification Refactoring: A Tool for Automatically Converting Java Method...Defaultification Refactoring: A Tool for Automatically Converting Java Method...
Defaultification Refactoring: A Tool for Automatically Converting Java Method...Raffi Khatchadourian
 
Introduction of Java 8 with emphasis on Lambda Expressions and Streams
Introduction of Java 8 with emphasis on Lambda Expressions and StreamsIntroduction of Java 8 with emphasis on Lambda Expressions and Streams
Introduction of Java 8 with emphasis on Lambda Expressions and StreamsEmiel Paasschens
 
Lambda Expressions in Java 8
Lambda Expressions in Java 8Lambda Expressions in Java 8
Lambda Expressions in Java 8icarter09
 
Lambdas and Streams in Java SE 8: Making Bulk Operations simple - Simon Ritter
Lambdas and Streams in Java SE 8: Making Bulk Operations simple - Simon RitterLambdas and Streams in Java SE 8: Making Bulk Operations simple - Simon Ritter
Lambdas and Streams in Java SE 8: Making Bulk Operations simple - Simon RitterJAXLondon2014
 
Applicative Logic Meta-Programming as the foundation for Template-based Progr...
Applicative Logic Meta-Programming as the foundation for Template-based Progr...Applicative Logic Meta-Programming as the foundation for Template-based Progr...
Applicative Logic Meta-Programming as the foundation for Template-based Progr...Coen De Roover
 
Core java concepts
Core java  conceptsCore java  concepts
Core java conceptsRam132
 
A Brief Conceptual Introduction to Functional Java 8 and its API
A Brief Conceptual Introduction to Functional Java 8 and its APIA Brief Conceptual Introduction to Functional Java 8 and its API
A Brief Conceptual Introduction to Functional Java 8 and its APIJörn Guy Süß JGS
 

Was ist angesagt? (20)

Lambda Functions in Java 8
Lambda Functions in Java 8Lambda Functions in Java 8
Lambda Functions in Java 8
 
Defaultification Refactoring: A Tool for Automatically Converting Java Method...
Defaultification Refactoring: A Tool for Automatically Converting Java Method...Defaultification Refactoring: A Tool for Automatically Converting Java Method...
Defaultification Refactoring: A Tool for Automatically Converting Java Method...
 
Java Basics
Java BasicsJava Basics
Java Basics
 
Java 8 lambda
Java 8 lambdaJava 8 lambda
Java 8 lambda
 
Introduction of Java 8 with emphasis on Lambda Expressions and Streams
Introduction of Java 8 with emphasis on Lambda Expressions and StreamsIntroduction of Java 8 with emphasis on Lambda Expressions and Streams
Introduction of Java 8 with emphasis on Lambda Expressions and Streams
 
Java 8 by example!
Java 8 by example!Java 8 by example!
Java 8 by example!
 
Java Basics
Java BasicsJava Basics
Java Basics
 
Lambda Expressions in Java 8
Lambda Expressions in Java 8Lambda Expressions in Java 8
Lambda Expressions in Java 8
 
Lambdas and Streams in Java SE 8: Making Bulk Operations simple - Simon Ritter
Lambdas and Streams in Java SE 8: Making Bulk Operations simple - Simon RitterLambdas and Streams in Java SE 8: Making Bulk Operations simple - Simon Ritter
Lambdas and Streams in Java SE 8: Making Bulk Operations simple - Simon Ritter
 
Applicative Logic Meta-Programming as the foundation for Template-based Progr...
Applicative Logic Meta-Programming as the foundation for Template-based Progr...Applicative Logic Meta-Programming as the foundation for Template-based Progr...
Applicative Logic Meta-Programming as the foundation for Template-based Progr...
 
Core java concepts
Core java  conceptsCore java  concepts
Core java concepts
 
Java Tutorial
Java TutorialJava Tutorial
Java Tutorial
 
Java 8
Java 8Java 8
Java 8
 
Java 8 Features
Java 8 FeaturesJava 8 Features
Java 8 Features
 
Basics of Java
Basics of JavaBasics of Java
Basics of Java
 
A Brief Conceptual Introduction to Functional Java 8 and its API
A Brief Conceptual Introduction to Functional Java 8 and its APIA Brief Conceptual Introduction to Functional Java 8 and its API
A Brief Conceptual Introduction to Functional Java 8 and its API
 
Java Tut1
Java Tut1Java Tut1
Java Tut1
 
Java 8 features
Java 8 featuresJava 8 features
Java 8 features
 
Java Fundamentals
Java FundamentalsJava Fundamentals
Java Fundamentals
 
Core java Essentials
Core java EssentialsCore java Essentials
Core java Essentials
 

Ähnlich wie Automatic Migration of Legacy Java Methods to Interfaces

Open Problems in Automatically Refactoring Legacy Java Software to use New Fe...
Open Problems in Automatically Refactoring Legacy Java Software to use New Fe...Open Problems in Automatically Refactoring Legacy Java Software to use New Fe...
Open Problems in Automatically Refactoring Legacy Java Software to use New Fe...Raffi Khatchadourian
 
Towards Improving Interface Modularity in Legacy Java Software Through Automa...
Towards Improving Interface Modularity in Legacy Java Software Through Automa...Towards Improving Interface Modularity in Legacy Java Software Through Automa...
Towards Improving Interface Modularity in Legacy Java Software Through Automa...Raffi Khatchadourian
 
Automated Refactoring of Legacy Java Software to Default Methods Talk at GMU
Automated Refactoring of Legacy Java Software to Default Methods Talk at GMUAutomated Refactoring of Legacy Java Software to Default Methods Talk at GMU
Automated Refactoring of Legacy Java Software to Default Methods Talk at GMURaffi Khatchadourian
 
Introduction to new features in java 8
Introduction to new features in java 8Introduction to new features in java 8
Introduction to new features in java 8Raffi Khatchadourian
 
Java 8 - An Overview
Java 8 - An OverviewJava 8 - An Overview
Java 8 - An OverviewIndrajit Das
 
Java8: what's new and what's hot
Java8: what's new and what's hotJava8: what's new and what's hot
Java8: what's new and what's hotSergii Maliarov
 
Software Uni Conf October 2014
Software Uni Conf October 2014Software Uni Conf October 2014
Software Uni Conf October 2014Nayden Gochev
 
21UCAC31 Java Programming.pdf(MTNC)(BCA)
21UCAC31 Java Programming.pdf(MTNC)(BCA)21UCAC31 Java Programming.pdf(MTNC)(BCA)
21UCAC31 Java Programming.pdf(MTNC)(BCA)ssuser7f90ae
 
Java 8 - Project Lambda
Java 8 - Project LambdaJava 8 - Project Lambda
Java 8 - Project LambdaRahman USTA
 
SOLID mit Java 8
SOLID mit Java 8SOLID mit Java 8
SOLID mit Java 8Roland Mast
 
java150929145120-lva1-app6892 (2).pptx
java150929145120-lva1-app6892 (2).pptxjava150929145120-lva1-app6892 (2).pptx
java150929145120-lva1-app6892 (2).pptxBruceLee275640
 
Lambdas And Streams in JDK8
Lambdas And Streams in JDK8Lambdas And Streams in JDK8
Lambdas And Streams in JDK8Simon Ritter
 

Ähnlich wie Automatic Migration of Legacy Java Methods to Interfaces (20)

Open Problems in Automatically Refactoring Legacy Java Software to use New Fe...
Open Problems in Automatically Refactoring Legacy Java Software to use New Fe...Open Problems in Automatically Refactoring Legacy Java Software to use New Fe...
Open Problems in Automatically Refactoring Legacy Java Software to use New Fe...
 
Towards Improving Interface Modularity in Legacy Java Software Through Automa...
Towards Improving Interface Modularity in Legacy Java Software Through Automa...Towards Improving Interface Modularity in Legacy Java Software Through Automa...
Towards Improving Interface Modularity in Legacy Java Software Through Automa...
 
Towards Improving Interface Modularity in Legacy Java Software Through Automa...
Towards Improving Interface Modularity in Legacy Java Software Through Automa...Towards Improving Interface Modularity in Legacy Java Software Through Automa...
Towards Improving Interface Modularity in Legacy Java Software Through Automa...
 
Automated Refactoring of Legacy Java Software to Default Methods Talk at GMU
Automated Refactoring of Legacy Java Software to Default Methods Talk at GMUAutomated Refactoring of Legacy Java Software to Default Methods Talk at GMU
Automated Refactoring of Legacy Java Software to Default Methods Talk at GMU
 
Introduction to new features in java 8
Introduction to new features in java 8Introduction to new features in java 8
Introduction to new features in java 8
 
Introduction to new features in java 8
Introduction to new features in java 8Introduction to new features in java 8
Introduction to new features in java 8
 
Colloquium Report
Colloquium ReportColloquium Report
Colloquium Report
 
Java 8 - An Overview
Java 8 - An OverviewJava 8 - An Overview
Java 8 - An Overview
 
Java 8 Intro - Core Features
Java 8 Intro - Core FeaturesJava 8 Intro - Core Features
Java 8 Intro - Core Features
 
Java8: what's new and what's hot
Java8: what's new and what's hotJava8: what's new and what's hot
Java8: what's new and what's hot
 
Software Uni Conf October 2014
Software Uni Conf October 2014Software Uni Conf October 2014
Software Uni Conf October 2014
 
Java 8 Feature Preview
Java 8 Feature PreviewJava 8 Feature Preview
Java 8 Feature Preview
 
21UCAC31 Java Programming.pdf(MTNC)(BCA)
21UCAC31 Java Programming.pdf(MTNC)(BCA)21UCAC31 Java Programming.pdf(MTNC)(BCA)
21UCAC31 Java Programming.pdf(MTNC)(BCA)
 
14274730 (1).ppt
14274730 (1).ppt14274730 (1).ppt
14274730 (1).ppt
 
Java 8 - Project Lambda
Java 8 - Project LambdaJava 8 - Project Lambda
Java 8 - Project Lambda
 
Insight into java 1.8, OOP VS FP
Insight into java 1.8, OOP VS FPInsight into java 1.8, OOP VS FP
Insight into java 1.8, OOP VS FP
 
SOLID mit Java 8
SOLID mit Java 8SOLID mit Java 8
SOLID mit Java 8
 
java150929145120-lva1-app6892 (2).pptx
java150929145120-lva1-app6892 (2).pptxjava150929145120-lva1-app6892 (2).pptx
java150929145120-lva1-app6892 (2).pptx
 
Java 8 Overview
Java 8 OverviewJava 8 Overview
Java 8 Overview
 
Lambdas And Streams in JDK8
Lambdas And Streams in JDK8Lambdas And Streams in JDK8
Lambdas And Streams in JDK8
 

Mehr von Raffi Khatchadourian

Towards Safe Automated Refactoring of Imperative Deep Learning Programs to Gr...
Towards Safe Automated Refactoring of Imperative Deep Learning Programs to Gr...Towards Safe Automated Refactoring of Imperative Deep Learning Programs to Gr...
Towards Safe Automated Refactoring of Imperative Deep Learning Programs to Gr...Raffi Khatchadourian
 
Automated Evolution of Feature Logging Statement Levels Using Git Histories a...
Automated Evolution of Feature Logging Statement Levels Using Git Histories a...Automated Evolution of Feature Logging Statement Levels Using Git Histories a...
Automated Evolution of Feature Logging Statement Levels Using Git Histories a...Raffi Khatchadourian
 
A Tool for Rejuvenating Feature Logging Levels via Git Histories and Degree o...
A Tool for Rejuvenating Feature Logging Levels via Git Histories and Degree o...A Tool for Rejuvenating Feature Logging Levels via Git Histories and Degree o...
A Tool for Rejuvenating Feature Logging Levels via Git Histories and Degree o...Raffi Khatchadourian
 
Challenges in Migrating Imperative Deep Learning Programs to Graph Execution:...
Challenges in Migrating Imperative Deep Learning Programs to Graph Execution:...Challenges in Migrating Imperative Deep Learning Programs to Graph Execution:...
Challenges in Migrating Imperative Deep Learning Programs to Graph Execution:...Raffi Khatchadourian
 
Actor Concurrency Bugs: A Comprehensive Study on Symptoms, Root Causes, API U...
Actor Concurrency Bugs: A Comprehensive Study on Symptoms, Root Causes, API U...Actor Concurrency Bugs: A Comprehensive Study on Symptoms, Root Causes, API U...
Actor Concurrency Bugs: A Comprehensive Study on Symptoms, Root Causes, API U...Raffi Khatchadourian
 
An Empirical Study of Refactorings and Technical Debt in Machine Learning Sys...
An Empirical Study of Refactorings and Technical Debt in Machine Learning Sys...An Empirical Study of Refactorings and Technical Debt in Machine Learning Sys...
An Empirical Study of Refactorings and Technical Debt in Machine Learning Sys...Raffi Khatchadourian
 
Automated Evolution of Feature Logging Statement Levels Using Git Histories a...
Automated Evolution of Feature Logging Statement Levels Using Git Histories a...Automated Evolution of Feature Logging Statement Levels Using Git Histories a...
Automated Evolution of Feature Logging Statement Levels Using Git Histories a...Raffi Khatchadourian
 
An Empirical Study on the Use and Misuse of Java 8 Streams
An Empirical Study on the Use and Misuse of Java 8 StreamsAn Empirical Study on the Use and Misuse of Java 8 Streams
An Empirical Study on the Use and Misuse of Java 8 StreamsRaffi Khatchadourian
 
Safe Automated Refactoring for Intelligent Parallelization of Java 8 Streams
Safe Automated Refactoring for Intelligent Parallelization of Java 8 StreamsSafe Automated Refactoring for Intelligent Parallelization of Java 8 Streams
Safe Automated Refactoring for Intelligent Parallelization of Java 8 StreamsRaffi Khatchadourian
 
Safe Automated Refactoring for Intelligent Parallelization of Java 8 Streams
Safe Automated Refactoring for Intelligent Parallelization of Java 8 StreamsSafe Automated Refactoring for Intelligent Parallelization of Java 8 Streams
Safe Automated Refactoring for Intelligent Parallelization of Java 8 StreamsRaffi Khatchadourian
 
A Brief Introduction to Type Constraints
A Brief Introduction to Type ConstraintsA Brief Introduction to Type Constraints
A Brief Introduction to Type ConstraintsRaffi Khatchadourian
 
Safe Automated Refactoring for Intelligent Parallelization of Java 8 Streams ...
Safe Automated Refactoring for Intelligent Parallelization of Java 8 Streams ...Safe Automated Refactoring for Intelligent Parallelization of Java 8 Streams ...
Safe Automated Refactoring for Intelligent Parallelization of Java 8 Streams ...Raffi Khatchadourian
 
A Tool for Optimizing Java 8 Stream Software via Automated Refactoring
A Tool for Optimizing Java 8 Stream Software via Automated RefactoringA Tool for Optimizing Java 8 Stream Software via Automated Refactoring
A Tool for Optimizing Java 8 Stream Software via Automated RefactoringRaffi Khatchadourian
 
Porting the NetBeans Java 8 Enhanced For Loop Lambda Expression Refactoring t...
Porting the NetBeans Java 8 Enhanced For Loop Lambda Expression Refactoring t...Porting the NetBeans Java 8 Enhanced For Loop Lambda Expression Refactoring t...
Porting the NetBeans Java 8 Enhanced For Loop Lambda Expression Refactoring t...Raffi Khatchadourian
 
Towards Safe Refactoring for Intelligent Parallelization of Java 8 Streams
Towards Safe Refactoring for Intelligent Parallelization of Java 8 StreamsTowards Safe Refactoring for Intelligent Parallelization of Java 8 Streams
Towards Safe Refactoring for Intelligent Parallelization of Java 8 StreamsRaffi Khatchadourian
 
Proactive Empirical Assessment of New Language Feature Adoption via Automated...
Proactive Empirical Assessment of New Language Feature Adoption via Automated...Proactive Empirical Assessment of New Language Feature Adoption via Automated...
Proactive Empirical Assessment of New Language Feature Adoption via Automated...Raffi Khatchadourian
 
Automated Refactoring of Legacy Java Software to Default Methods Talk at ICSE...
Automated Refactoring of Legacy Java Software to Default Methods Talk at ICSE...Automated Refactoring of Legacy Java Software to Default Methods Talk at ICSE...
Automated Refactoring of Legacy Java Software to Default Methods Talk at ICSE...Raffi Khatchadourian
 
Poster on Automated Refactoring of Legacy Java Software to Default Methods
Poster on Automated Refactoring of Legacy Java Software to Default MethodsPoster on Automated Refactoring of Legacy Java Software to Default Methods
Poster on Automated Refactoring of Legacy Java Software to Default MethodsRaffi Khatchadourian
 
Detecting Broken Pointcuts using Structural Commonality and Degree of Interest
Detecting Broken Pointcuts using Structural Commonality and Degree of InterestDetecting Broken Pointcuts using Structural Commonality and Degree of Interest
Detecting Broken Pointcuts using Structural Commonality and Degree of InterestRaffi Khatchadourian
 
Fraglight: Shedding Light on Broken Pointcuts in Evolving Aspect-Oriented Sof...
Fraglight: Shedding Light on Broken Pointcuts in Evolving Aspect-Oriented Sof...Fraglight: Shedding Light on Broken Pointcuts in Evolving Aspect-Oriented Sof...
Fraglight: Shedding Light on Broken Pointcuts in Evolving Aspect-Oriented Sof...Raffi Khatchadourian
 

Mehr von Raffi Khatchadourian (20)

Towards Safe Automated Refactoring of Imperative Deep Learning Programs to Gr...
Towards Safe Automated Refactoring of Imperative Deep Learning Programs to Gr...Towards Safe Automated Refactoring of Imperative Deep Learning Programs to Gr...
Towards Safe Automated Refactoring of Imperative Deep Learning Programs to Gr...
 
Automated Evolution of Feature Logging Statement Levels Using Git Histories a...
Automated Evolution of Feature Logging Statement Levels Using Git Histories a...Automated Evolution of Feature Logging Statement Levels Using Git Histories a...
Automated Evolution of Feature Logging Statement Levels Using Git Histories a...
 
A Tool for Rejuvenating Feature Logging Levels via Git Histories and Degree o...
A Tool for Rejuvenating Feature Logging Levels via Git Histories and Degree o...A Tool for Rejuvenating Feature Logging Levels via Git Histories and Degree o...
A Tool for Rejuvenating Feature Logging Levels via Git Histories and Degree o...
 
Challenges in Migrating Imperative Deep Learning Programs to Graph Execution:...
Challenges in Migrating Imperative Deep Learning Programs to Graph Execution:...Challenges in Migrating Imperative Deep Learning Programs to Graph Execution:...
Challenges in Migrating Imperative Deep Learning Programs to Graph Execution:...
 
Actor Concurrency Bugs: A Comprehensive Study on Symptoms, Root Causes, API U...
Actor Concurrency Bugs: A Comprehensive Study on Symptoms, Root Causes, API U...Actor Concurrency Bugs: A Comprehensive Study on Symptoms, Root Causes, API U...
Actor Concurrency Bugs: A Comprehensive Study on Symptoms, Root Causes, API U...
 
An Empirical Study of Refactorings and Technical Debt in Machine Learning Sys...
An Empirical Study of Refactorings and Technical Debt in Machine Learning Sys...An Empirical Study of Refactorings and Technical Debt in Machine Learning Sys...
An Empirical Study of Refactorings and Technical Debt in Machine Learning Sys...
 
Automated Evolution of Feature Logging Statement Levels Using Git Histories a...
Automated Evolution of Feature Logging Statement Levels Using Git Histories a...Automated Evolution of Feature Logging Statement Levels Using Git Histories a...
Automated Evolution of Feature Logging Statement Levels Using Git Histories a...
 
An Empirical Study on the Use and Misuse of Java 8 Streams
An Empirical Study on the Use and Misuse of Java 8 StreamsAn Empirical Study on the Use and Misuse of Java 8 Streams
An Empirical Study on the Use and Misuse of Java 8 Streams
 
Safe Automated Refactoring for Intelligent Parallelization of Java 8 Streams
Safe Automated Refactoring for Intelligent Parallelization of Java 8 StreamsSafe Automated Refactoring for Intelligent Parallelization of Java 8 Streams
Safe Automated Refactoring for Intelligent Parallelization of Java 8 Streams
 
Safe Automated Refactoring for Intelligent Parallelization of Java 8 Streams
Safe Automated Refactoring for Intelligent Parallelization of Java 8 StreamsSafe Automated Refactoring for Intelligent Parallelization of Java 8 Streams
Safe Automated Refactoring for Intelligent Parallelization of Java 8 Streams
 
A Brief Introduction to Type Constraints
A Brief Introduction to Type ConstraintsA Brief Introduction to Type Constraints
A Brief Introduction to Type Constraints
 
Safe Automated Refactoring for Intelligent Parallelization of Java 8 Streams ...
Safe Automated Refactoring for Intelligent Parallelization of Java 8 Streams ...Safe Automated Refactoring for Intelligent Parallelization of Java 8 Streams ...
Safe Automated Refactoring for Intelligent Parallelization of Java 8 Streams ...
 
A Tool for Optimizing Java 8 Stream Software via Automated Refactoring
A Tool for Optimizing Java 8 Stream Software via Automated RefactoringA Tool for Optimizing Java 8 Stream Software via Automated Refactoring
A Tool for Optimizing Java 8 Stream Software via Automated Refactoring
 
Porting the NetBeans Java 8 Enhanced For Loop Lambda Expression Refactoring t...
Porting the NetBeans Java 8 Enhanced For Loop Lambda Expression Refactoring t...Porting the NetBeans Java 8 Enhanced For Loop Lambda Expression Refactoring t...
Porting the NetBeans Java 8 Enhanced For Loop Lambda Expression Refactoring t...
 
Towards Safe Refactoring for Intelligent Parallelization of Java 8 Streams
Towards Safe Refactoring for Intelligent Parallelization of Java 8 StreamsTowards Safe Refactoring for Intelligent Parallelization of Java 8 Streams
Towards Safe Refactoring for Intelligent Parallelization of Java 8 Streams
 
Proactive Empirical Assessment of New Language Feature Adoption via Automated...
Proactive Empirical Assessment of New Language Feature Adoption via Automated...Proactive Empirical Assessment of New Language Feature Adoption via Automated...
Proactive Empirical Assessment of New Language Feature Adoption via Automated...
 
Automated Refactoring of Legacy Java Software to Default Methods Talk at ICSE...
Automated Refactoring of Legacy Java Software to Default Methods Talk at ICSE...Automated Refactoring of Legacy Java Software to Default Methods Talk at ICSE...
Automated Refactoring of Legacy Java Software to Default Methods Talk at ICSE...
 
Poster on Automated Refactoring of Legacy Java Software to Default Methods
Poster on Automated Refactoring of Legacy Java Software to Default MethodsPoster on Automated Refactoring of Legacy Java Software to Default Methods
Poster on Automated Refactoring of Legacy Java Software to Default Methods
 
Detecting Broken Pointcuts using Structural Commonality and Degree of Interest
Detecting Broken Pointcuts using Structural Commonality and Degree of InterestDetecting Broken Pointcuts using Structural Commonality and Degree of Interest
Detecting Broken Pointcuts using Structural Commonality and Degree of Interest
 
Fraglight: Shedding Light on Broken Pointcuts in Evolving Aspect-Oriented Sof...
Fraglight: Shedding Light on Broken Pointcuts in Evolving Aspect-Oriented Sof...Fraglight: Shedding Light on Broken Pointcuts in Evolving Aspect-Oriented Sof...
Fraglight: Shedding Light on Broken Pointcuts in Evolving Aspect-Oriented Sof...
 

Kürzlich hochgeladen

Mastering MySQL Database Architecture: Deep Dive into MySQL Shell and MySQL R...
Mastering MySQL Database Architecture: Deep Dive into MySQL Shell and MySQL R...Mastering MySQL Database Architecture: Deep Dive into MySQL Shell and MySQL R...
Mastering MySQL Database Architecture: Deep Dive into MySQL Shell and MySQL R...Miguel Araújo
 
Slack Application Development 101 Slides
Slack Application Development 101 SlidesSlack Application Development 101 Slides
Slack Application Development 101 Slidespraypatel2
 
Boost PC performance: How more available memory can improve productivity
Boost PC performance: How more available memory can improve productivityBoost PC performance: How more available memory can improve productivity
Boost PC performance: How more available memory can improve productivityPrincipled Technologies
 
Exploring the Future Potential of AI-Enabled Smartphone Processors
Exploring the Future Potential of AI-Enabled Smartphone ProcessorsExploring the Future Potential of AI-Enabled Smartphone Processors
Exploring the Future Potential of AI-Enabled Smartphone Processorsdebabhi2
 
How to convert PDF to text with Nanonets
How to convert PDF to text with NanonetsHow to convert PDF to text with Nanonets
How to convert PDF to text with Nanonetsnaman860154
 
Automating Google Workspace (GWS) & more with Apps Script
Automating Google Workspace (GWS) & more with Apps ScriptAutomating Google Workspace (GWS) & more with Apps Script
Automating Google Workspace (GWS) & more with Apps Scriptwesley chun
 
Data Cloud, More than a CDP by Matt Robison
Data Cloud, More than a CDP by Matt RobisonData Cloud, More than a CDP by Matt Robison
Data Cloud, More than a CDP by Matt RobisonAnna Loughnan Colquhoun
 
Axa Assurance Maroc - Insurer Innovation Award 2024
Axa Assurance Maroc - Insurer Innovation Award 2024Axa Assurance Maroc - Insurer Innovation Award 2024
Axa Assurance Maroc - Insurer Innovation Award 2024The Digital Insurer
 
Handwritten Text Recognition for manuscripts and early printed texts
Handwritten Text Recognition for manuscripts and early printed textsHandwritten Text Recognition for manuscripts and early printed texts
Handwritten Text Recognition for manuscripts and early printed textsMaria Levchenko
 
How to Troubleshoot Apps for the Modern Connected Worker
How to Troubleshoot Apps for the Modern Connected WorkerHow to Troubleshoot Apps for the Modern Connected Worker
How to Troubleshoot Apps for the Modern Connected WorkerThousandEyes
 
Driving Behavioral Change for Information Management through Data-Driven Gree...
Driving Behavioral Change for Information Management through Data-Driven Gree...Driving Behavioral Change for Information Management through Data-Driven Gree...
Driving Behavioral Change for Information Management through Data-Driven Gree...Enterprise Knowledge
 
04-2024-HHUG-Sales-and-Marketing-Alignment.pptx
04-2024-HHUG-Sales-and-Marketing-Alignment.pptx04-2024-HHUG-Sales-and-Marketing-Alignment.pptx
04-2024-HHUG-Sales-and-Marketing-Alignment.pptxHampshireHUG
 
08448380779 Call Girls In Greater Kailash - I Women Seeking Men
08448380779 Call Girls In Greater Kailash - I Women Seeking Men08448380779 Call Girls In Greater Kailash - I Women Seeking Men
08448380779 Call Girls In Greater Kailash - I Women Seeking MenDelhi Call girls
 
GenCyber Cyber Security Day Presentation
GenCyber Cyber Security Day PresentationGenCyber Cyber Security Day Presentation
GenCyber Cyber Security Day PresentationMichael W. Hawkins
 
Tata AIG General Insurance Company - Insurer Innovation Award 2024
Tata AIG General Insurance Company - Insurer Innovation Award 2024Tata AIG General Insurance Company - Insurer Innovation Award 2024
Tata AIG General Insurance Company - Insurer Innovation Award 2024The Digital Insurer
 
A Call to Action for Generative AI in 2024
A Call to Action for Generative AI in 2024A Call to Action for Generative AI in 2024
A Call to Action for Generative AI in 2024Results
 
Salesforce Community Group Quito, Salesforce 101
Salesforce Community Group Quito, Salesforce 101Salesforce Community Group Quito, Salesforce 101
Salesforce Community Group Quito, Salesforce 101Paola De la Torre
 
From Event to Action: Accelerate Your Decision Making with Real-Time Automation
From Event to Action: Accelerate Your Decision Making with Real-Time AutomationFrom Event to Action: Accelerate Your Decision Making with Real-Time Automation
From Event to Action: Accelerate Your Decision Making with Real-Time AutomationSafe Software
 
Partners Life - Insurer Innovation Award 2024
Partners Life - Insurer Innovation Award 2024Partners Life - Insurer Innovation Award 2024
Partners Life - Insurer Innovation Award 2024The Digital Insurer
 
🐬 The future of MySQL is Postgres 🐘
🐬  The future of MySQL is Postgres   🐘🐬  The future of MySQL is Postgres   🐘
🐬 The future of MySQL is Postgres 🐘RTylerCroy
 

Kürzlich hochgeladen (20)

Mastering MySQL Database Architecture: Deep Dive into MySQL Shell and MySQL R...
Mastering MySQL Database Architecture: Deep Dive into MySQL Shell and MySQL R...Mastering MySQL Database Architecture: Deep Dive into MySQL Shell and MySQL R...
Mastering MySQL Database Architecture: Deep Dive into MySQL Shell and MySQL R...
 
Slack Application Development 101 Slides
Slack Application Development 101 SlidesSlack Application Development 101 Slides
Slack Application Development 101 Slides
 
Boost PC performance: How more available memory can improve productivity
Boost PC performance: How more available memory can improve productivityBoost PC performance: How more available memory can improve productivity
Boost PC performance: How more available memory can improve productivity
 
Exploring the Future Potential of AI-Enabled Smartphone Processors
Exploring the Future Potential of AI-Enabled Smartphone ProcessorsExploring the Future Potential of AI-Enabled Smartphone Processors
Exploring the Future Potential of AI-Enabled Smartphone Processors
 
How to convert PDF to text with Nanonets
How to convert PDF to text with NanonetsHow to convert PDF to text with Nanonets
How to convert PDF to text with Nanonets
 
Automating Google Workspace (GWS) & more with Apps Script
Automating Google Workspace (GWS) & more with Apps ScriptAutomating Google Workspace (GWS) & more with Apps Script
Automating Google Workspace (GWS) & more with Apps Script
 
Data Cloud, More than a CDP by Matt Robison
Data Cloud, More than a CDP by Matt RobisonData Cloud, More than a CDP by Matt Robison
Data Cloud, More than a CDP by Matt Robison
 
Axa Assurance Maroc - Insurer Innovation Award 2024
Axa Assurance Maroc - Insurer Innovation Award 2024Axa Assurance Maroc - Insurer Innovation Award 2024
Axa Assurance Maroc - Insurer Innovation Award 2024
 
Handwritten Text Recognition for manuscripts and early printed texts
Handwritten Text Recognition for manuscripts and early printed textsHandwritten Text Recognition for manuscripts and early printed texts
Handwritten Text Recognition for manuscripts and early printed texts
 
How to Troubleshoot Apps for the Modern Connected Worker
How to Troubleshoot Apps for the Modern Connected WorkerHow to Troubleshoot Apps for the Modern Connected Worker
How to Troubleshoot Apps for the Modern Connected Worker
 
Driving Behavioral Change for Information Management through Data-Driven Gree...
Driving Behavioral Change for Information Management through Data-Driven Gree...Driving Behavioral Change for Information Management through Data-Driven Gree...
Driving Behavioral Change for Information Management through Data-Driven Gree...
 
04-2024-HHUG-Sales-and-Marketing-Alignment.pptx
04-2024-HHUG-Sales-and-Marketing-Alignment.pptx04-2024-HHUG-Sales-and-Marketing-Alignment.pptx
04-2024-HHUG-Sales-and-Marketing-Alignment.pptx
 
08448380779 Call Girls In Greater Kailash - I Women Seeking Men
08448380779 Call Girls In Greater Kailash - I Women Seeking Men08448380779 Call Girls In Greater Kailash - I Women Seeking Men
08448380779 Call Girls In Greater Kailash - I Women Seeking Men
 
GenCyber Cyber Security Day Presentation
GenCyber Cyber Security Day PresentationGenCyber Cyber Security Day Presentation
GenCyber Cyber Security Day Presentation
 
Tata AIG General Insurance Company - Insurer Innovation Award 2024
Tata AIG General Insurance Company - Insurer Innovation Award 2024Tata AIG General Insurance Company - Insurer Innovation Award 2024
Tata AIG General Insurance Company - Insurer Innovation Award 2024
 
A Call to Action for Generative AI in 2024
A Call to Action for Generative AI in 2024A Call to Action for Generative AI in 2024
A Call to Action for Generative AI in 2024
 
Salesforce Community Group Quito, Salesforce 101
Salesforce Community Group Quito, Salesforce 101Salesforce Community Group Quito, Salesforce 101
Salesforce Community Group Quito, Salesforce 101
 
From Event to Action: Accelerate Your Decision Making with Real-Time Automation
From Event to Action: Accelerate Your Decision Making with Real-Time AutomationFrom Event to Action: Accelerate Your Decision Making with Real-Time Automation
From Event to Action: Accelerate Your Decision Making with Real-Time Automation
 
Partners Life - Insurer Innovation Award 2024
Partners Life - Insurer Innovation Award 2024Partners Life - Insurer Innovation Award 2024
Partners Life - Insurer Innovation Award 2024
 
🐬 The future of MySQL is Postgres 🐘
🐬  The future of MySQL is Postgres   🐘🐬  The future of MySQL is Postgres   🐘
🐬 The future of MySQL is Postgres 🐘
 

Automatic Migration of Legacy Java Methods to Interfaces

  • 1. Automatic Migration of LegacyAutomatic Migration of Legacy Java Method ImplementationsJava Method Implementations to Interfacesto Interfaces Work in ProgressWork in Progress Raffi Khatchadourian Computer Systems Technology New York City College of Technology City University of New York Department of Computer Science College of Staten Island City University of New York June 12, 2015 Based on slides by Duarte Duarte, Eduardo Martins, Miguel Marques and Ruben Cordeiro and Horstmann, Cay S. (2014-01-10). Java SE8 for the Really Impatient: A Short Course on the Basics (Java Series). Pearson Education.
  • 2. Some demonstration code at: .http://github.com/khatchad/java8-demo
  • 3. Some HistorySome History Java was invented in the 90's as an Object-Oriented language. Largest change was in ~2005 with Java 5. Generics. Enhanced for loops. Annotations. Type-safe enumerations. Concurrency enhancements (AtomicInteger).
  • 4. Java 8 is MassiveJava 8 is Massive 10 years later, Java 8 is packed with new features. Core changes are to incorporate functional language features.
  • 5. Functional LanguagesFunctional Languages Declarative ("what not how"). The only state is held in parameters. Traditionally popular in academia and AI. Well-suited for event-driven/concurrent ("reactive") programs.
  • 6. Lambda ExpressionsLambda Expressions A block of code that you can pass around so it can be executed later, once or multiple times. Anonymous methods. Reduce verbosity caused by anonymous classes.
  • 7. How are they different from Java methods?
  • 8. LambdasLambdas (int x, int y) -> x + y () -> 42 (String s) -> {System.out.println(s);} () -> {return "Hello";}
  • 9. LambdasLambdas ExamplesExamples BeforeBefore Button btn = new Button(); final PrintStream pStream = ...; btn.setOnAction(new EventHandler<ActionEvent>() { @Override public void handle(ActionEvent e) { pStream.println("Button Clicked!"); } }); AfterAfter Button btn = new Button(); final PrintStream pStream = ...; btn.setOnAction(e -> pStream.println("Button Clicked!"));
  • 10. LambdasLambdas ExamplesExamples List<String> strs = ...; Collections.sort(strs, (s1, s2) -> Integer.compare(s1.length(), s2.length())); new Thread(() -> { connectToService(); sendNotification(); }).start();
  • 12. Functional InterfacesFunctional Interfaces ExampleExample @FunctionalInterface public interface Runnable { public void run(); } Runnable r = () -> System.out.println("Hello World!"); @FunctionalInterface: May be omitted. Generates an error when there is more than one abstract method. Can store a lambda expression in a variable. Can return a lambda expression.
  • 13. java.util.functionjava.util.function Predicate<T> - a boolean-valued property of an object Consumer<T> - an action to be performed on an object Function<T,R> - a function transforming a T to a R Supplier<T> - provide an instance of a T (such as a factory) UnaryOperator<T> - a function from T to T BinaryOperator<T> - a function from (T,T) to T
  • 14. Method ReferencesMethod References Treating an existing method as an instance of a Functional Interface
  • 15. Method ReferencesMethod References ExamplesExamples class Person { private String name; private int age; public int getAge() {return this.age;} public String getName() {return this.name;} } Person[] people = ...; Comparator<Person> byName = Comparator.comparing(Person::getName); Arrays.sort(people, byName);
  • 16. Method ReferencesMethod References Kinds of method referencesKinds of method references A static method (ClassName::methName) An instance method of a particular object (instanceRef::methName) A super method of a particular object (super::methName) An instance method of an arbitrary object of a particular type (ClassName::methName) A class constructor reference (ClassName::new) An array constructor reference (TypeName[]::new)
  • 17. Method ReferencesMethod References More ExamplesMore Examples Consumer<Integer> b1 = System::exit; Consumer<String[]> b2 = Arrays::sort; Consumer<String[]> b3 = MyProgram::main;
  • 18. Default MethodsDefault Methods Add default behaviors to interfaces
  • 19. Why default methods?Why default methods? Java 8 has lambda expressions. We want to start using them: List<?> list = ... list.forEach(...); // lambda code goes here
  • 20. There's a problemThere's a problem The forEach method isn’t declared by java.util.List nor the java.util.Collection interface because doing so would break existing implementations.
  • 21. Default MethodsDefault Methods We have lambdas, but we can't force new behaviors into current libraries. Solution: default methods.
  • 22. Default MethodsDefault Methods Traditionally, interfaces can't have method definitions (just declarations). Default methods supply default implementations of interface methods. By default, implementers will receive this implementation if they don't provide their own.
  • 25. public interface A { default void foo() { System.out.println("Calling A.foo()"); } } public class Clazz implements A { }
  • 26. Client codeClient code Clazz clazz = new Clazz(); clazz.foo(); OutputOutput "Calling A.foo()"
  • 27. Example 2Example 2 Getting messyGetting messy
  • 28. public interface A { default void foo(){ System.out.println("Calling A.foo()"); } } public interface B { default void foo(){ System.out.println("Calling B.foo()"); } } public class Clazz implements A, B { } Does this code compile?
  • 29. Of course not (Java is not C++)! class Clazz inherits defaults for foo() from both types A and B How do we fix it?
  • 30. Option A: public class Clazz implements A, B { public void foo(){/* ... */} } We resolve it manually by overriding the conflicting method. Option B: public class Clazz implements A, B { public void foo(){ A.super.foo(); // or B.super.foo() } } We call the default implementation of method foo() from either interface A or B instead of implementing our own.
  • 31. Going back to the example of forEach method, how can we force it's default implementation on all of the iterable collections?
  • 32. Let's take a look at the Java UML for all the iterable Collections: To add a default behavior to all the iterable collections, a default forEach method was added to the Iterable<E> interface.
  • 33. We can find its default implementation in java.lang.Iterable interface: @FunctionalInterface public interface Iterable { Iterator iterator(); default void forEach(Consumer<? super T> action) { Objects.requireNonNull(action); for (T t : this) { action.accept(t); } } }
  • 34. The forEach method takes a java.util.function.Consumer functional interface type as a parameter, which enables us to pass in a lambda or a method reference as follows: List<?> list = ... list.forEach(System.out::println); This is also valid for Sets and Queues, for example, since both classes implement the Iterable interface. Specific collections, e.g., UnmodifiableCollection, may override the default implementation.
  • 35. SummarySummary Default methods can be seen as a bridge between lambdas and JDK libraries. Can be used in interfaces to provide default implementations of otherwise abstract methods. Clients can optionally implement (override) them. Can eliminate the need for skeletal implementators like . Can eliminate the need for utility classes like . static methods are now also allowed in interfaces. AbstractCollection Collections
  • 36. Open ProblemsOpen Problems Can eliminate the need for skeletal implementators like .AbstractCollection
  • 37. MotivationMotivation Two cases: 1. Complete migration of skeletal implementation to interface. Makes type hierarchy less complicated. One less type. Makes interfaces easier to implement. No global analysis required to find skeletal implemention. Makes interfaces easier to maintain. No simultaneous modifications between interface and skeletal implementation required. 2. Partial migration of skeletal implementation to interface. Possibly makes interfaces easier to implement. All implementations may not need to extended the skeletal implementation. Possibly makes interfaces easier to maintain. Possibily less simultaneous modifications between interface and skeletal implementation required.
  • 38. Open ProblemsOpen Problems Can eliminate the need for utility classes like .Collections
  • 39. MotivationMotivation Two cases: 1. Complete migration of utility classes to interface(s). Makes type hierarchy less complicated. One less type. Makes interfaces easier to use. No global analysis required to find utility class. Only methods applicable to the interface are present. Can call methods like instance methods (a.b() instead of b(a)). IDE will show applicable methods. 2. Partial migration of utility classes to interface(s). Still makes interfaces easier to use for certain methods. Can avoid global analysis in some cases.
  • 40. Open ProblemsOpen Problems Can eliminate the need for skeletal implementators like .AbstractCollection Can we automate this?Can we automate this? 1. How do we determine if an interface implementor is "skeletal?" 2. What is the criteria for an instance method to be converted to a default method? 3. What if there is a hierarchy of skeletal implementors, e.g., AbstractCollection, AbstractList? 4. How do we preserve semantics? 5. What client changes are necessary?
  • 41. Skeletal ImplementatorsSkeletal Implementators Abstract classes that provide skeletal implementations for interfaces. Let's take a look at the Java UML for AbstractCollection:
  • 42. Open ProblemsOpen Problems Can eliminate the need for utility classes like .Collections Can we automate this?Can we automate this? 1. How do we determine if a class is a "utility" class? 2. What is the criteria for a static method to be: Converted to an instance method? Moved to an interface? 3. How do we preserve semantics? 4. What client changes are necessary?
  • 43. Let's start with question #2 for both the previous slides. There seems to be a few cases here: # From a class To an interface 1. instance method default method 2. static method default method 3. static method static method Is case #3 a simple move method refactoring? (Yes but to where? -- more later)
  • 44. Why Is This Complicated?Why Is This Complicated? Case #1 corresponds to moving a skeletal implementation to an interface. # From a class To an interface 1. instance method default method For case #1, can we not simply use a move method refactoring? No. The inherent problem is that, unlike classes, interfaces may extend multiple interfaces. As such, we now have a kind of multiple inheritance problem to deal with.
  • 45. Case #1Case #1 Some (perhaps) Obvious PreconditionsSome (perhaps) Obvious Preconditions Source instance method must not access any instance fields. Interfaces may not have instance fields. Can't currently have a default method in the target interface with the same signature. Can't modify target method's visibility. Some Obvious TasksSome Obvious Tasks Must replace the target method in the interface (add a body to it). Must add the default keyword. Must remove any @Override annotations (it's top-level now). If nothing left in abstract class, remove it? Need to deal with documentation.
  • 46. Case #1Case #1 Some Not-so-obvious PreconditionsSome Not-so-obvious Preconditions Suppose we have the following situation: interface I { void m(); } interface J { void m(); } abstract class A implements I, J { @Override void m() {...} } Here, A provides a partial implementation of I.m(), which also happens to be declared as part of interface J.
  • 47. Case #1Case #1 Some Not-so-obvious PreconditionsSome Not-so-obvious Preconditions Now, we pull up A.m() to be a default method of I: interface I { default void m() {..} //was void m(); } interface J { void m(); //stays the same. } abstract class A implements I, J { //now empty, was: void m() {...} } We now have a compile-time error in A because A needs to declare which m() it inherits. In general, inheritance hierarchies may be large and complicated. Other preconditions may also exist (work in progress).
  • 48. Why Is This Complicated?Why Is This Complicated? Case #3 corresponds to moving a static utility method to an interface. # From a class To an interface 3. static method default method For case #1, can we not simply use a move method refactoring? No and for a few reasons: Method signature must change (not only removing the static keyword). Client code must change from static method calls to instance method calls. Which parameter is to be the receiver of the call? What is the target interface?
  • 49. Case #3Case #3 Some (perhaps) Obvious PreconditionsSome (perhaps) Obvious Preconditions The source method vaciously doesn't access instance fields. Default version of the source method can't already exist in the target interface. Some Obvious TasksSome Obvious Tasks Must add the default keyword. If nothing left in utility class, remove it? Need to deal with documentation.
  • 50. Case #3Case #3 Some Not-so-obvious PreconditionsSome Not-so-obvious Preconditions /** * Copies all of the elements from one list into another. */ public static <T> void Collections.copy(List<? super T> dest, List<? extends T Should this be a static or default method? Call it as Collections.copy(l2, l1) or l2.copy(l1)? It's probably more natural to leave it as static . Also, we can't express the generics if it was refactored to a default method. The generics here express the relationship between the two lists in a single method. We can't do if it was default.
  • 51. Case #3Case #3 You may be tempted to move the copy method to a default method in List, but since the method uses generics and expresses a very distinct relationship between two two Lists, you will lose the type safety offered by the generics. For example, suppose you have: List<String> l1; List<String> l2; Now, you copy the contents of l2 into l1: Collections.copy(l1, l2); If l2 is, instead, List<Integer>, you will receive a compile-time error. However, if copy was a default method of, say, the List interface, we would have something like this: l1.copy(l2) Making l2 a List<Integer> would not result in a compile-time error.
  • 52. Case #3Case #3 This method should actually move to the List interface and remain static, but: What is there's another method named copy in the List interface? List is an interface, and interfaces can extend other interfaces. What if there's another method with the same signature in the hierarchy?
  • 53. Case #4Case #4 Determining the target interface for caseDetermining the target interface for case #4#4 We can apply a heuristic: take the least common interface of the parameters. For example: public static void m(I1 p1, I2 p2, ..., In pn); Here, we would take the closest sibling to I1, I2, ..., In as the target interface. Otherwise, we normally take the first parameter if it's an interface.
  • 55. java.util.streamjava.util.stream List<Student> students = ...; Stream stream = students.stream(); // sequential version // parallel version Stream parallelStream = students.parallelStream(); traversed once infinite lazy
  • 56. java.util.streamjava.util.stream Stream sourcesStream sources CollectionsCollections Set<Student> set = new LinkedHashSet<>(); Stream<Student> stream = set.stream(); GeneratorsGenerators Random random = new Random(); Stream<Integer> randomNumbers = Stream.generate(random::nextInt); // or simply ... IntStream moreRandomNumbers = random.ints(); From other streamsFrom other streams Stream newStream = Stream.concat(stream, randomNumbers);
  • 57. java.util.streamjava.util.stream Intermediate operationsIntermediate operations .filter - excludes all elements that don’t match a Predicate .map - perform transformation of elements using a Function .flatMap - transform each element into zero or more elements by way of another Stream .peek - performs some action on each element .distinct - excludes all duplicate elements (equals()) .sorted - orderered elements (Comparator) .limit - maximum number of elements .substream - range (by index) of elements List<Person> persons = ...; Stream<Person> tenPersonsOver18 = persons.stream() .filter(p -> p.getAge() > 18) .limit(10);
  • 58. java.util.streamjava.util.stream Terminating operationsTerminating operations 1. Obtain a stream from some sources 2. Perform one or more intermidate operations 3. Perform one terminal operation reducers like reduce(), count(), findAny(), findFirst() collectors (collect()) forEach iterators List<Person> persons = ..; List<Student> students = persons.stream() .filter(p -> p.getAge() > 18) .map(Student::new) .collect(Collectors.toList());
  • 59. java.util.streamjava.util.stream Parallel & SequentialParallel & Sequential List<Person> persons = ..; List<Student> students = persons.stream() .parallel() .filter(p -> p.getAge() > 18) .sequential() .map(Student::new) .collect(Collectors.toCollection(ArrayList::new));
  • 60. References & Documentation &References & Documentation & Interesting LinksInteresting Links Horstmann, Cay S. (2014-01-10). Java SE8 for the Really Impatient: A Short Cour Basics (Java Series). Pearson Education. http://download.java.net/jdk8/docs/ http://download.java.net/jdk8/docs/api/ https://blogs.oracle.com/thejavatutorials/entry/jdk_8_documentation_develope http://docs.oracle.com/javase/tutorial/java/javaOO/lambdaexpressions.html