
Lambdas in Java: An Overview of Anonymous Functions
Explore the concept of lambda expressions in Java, which are anonymous functions that can be created without method declarations or class associations. Learn how Lambdas offer flexibility by being passed as arguments to functions, enhancing code readability and efficiency. Discover the benefits of using Lambdas in Java programming introduced in Java 8.
Download Presentation

Please find below an Image/Link to download the presentation.
The content on the website is provided AS IS for your information and personal use only. It may not be sold, licensed, or shared on other websites without obtaining consent from the author. If you encounter any issues during the download, it is possible that the publisher has removed the file from their server.
You are allowed to download the files provided on this website for personal or commercial use, subject to the condition that they are used lawfully. All files are the property of their respective owners.
The content on the website is provided AS IS for your information and personal use only. It may not be sold, licensed, or shared on other websites without obtaining consent from the author.
E N D
Presentation Transcript
Recitation 11 Lambdas ---anonymous functions---
What are Lambdas? Lambda expressions are anonymous functions They can be created without method declarations and without belonging to any class They can be passed as arguments to functions They are useful! Introduced in Java 8
Why Lambdas? JButton jb= new JButton( example ); jb.addActionListener(function_to_call); Java 7: Argument must be an object Java 8: Argument can be anon. function class PaintGUI implements ActionListener { class PaintGUI { JButton jb= new JButton( example ); jb.addActionListener(this); JButton jb= new JButton( example ); jb.addActionListener((e) -> { }); This is an anonymous function aka a "lamda expression" @override public void actionPerformed(ActionEvent e){ Object s = e.getSource(); if(s == pencil){ } if(s == jb){ } } } }
Another Example: Customizing Comparison Java implements a class PriorityQueue new PriorityQueue<E>() - uses compareTo implemented by E But what it you want to use a different order? - reverse order - case insensitive PriorityQueues s constructor can take a Comparator!
Java 7: Anonymous Inner Class Goal: sort non-negative integers modulo n Can access variables that are assigned to exactly once int n = ; // > 0 = new PriorityQueue<Integer>( new Comparator<Integer>() { public int compare(Integer x, Integer y) { return x % n y % n; } } }); This is clunky! Old Java
With Lambdas Only one abstract method to implement, so we can use a lambda! Can still access variables that are assigned to exactly once int n = ; // > 0 = new PriorityQueue<Integer>( ( x, ); Integer Integer y) -> x % n y % n arrow expression parameters Java takes care of turning this lambda into a Comparator
Try it Out /** Print out the lower-cased versions of the * non-empty strings in strs in order of length. */ public void practice(List<String> strs) { // no loops! strs.removeIf( ); strs.replaceAll( ); strs.sort( ); strs.forEach( ); }
Answer /** Print out the lower-cased versions of the * non-empty strings in strs in order of length. */ public void practice(List<String> strs) { // no loops! strs.removeIf(s -> s.isEmpty()); strs.replaceAll(s -> s.toLowerCase()); strs.sort((s1, s2) -> s1.length() s2.length()); strs.forEach(s -> System.out.println(s)); }
More Complex Lambdas /** Maps [a, b, c] to [a, a, b, b, c, c] */ public <T> List<T> doubleList(List<T> list) { List<T> d = new ArrayList<T>(); list.forEach(t -> { d.add(t); d.add(t); }); return d; } block braces
More Complex Lambdas List<List<Integer>> lists = ; // no nulls // sort so that [1, 3] is before [2, 4, 5] lists.sort((List<Integer> left, List<Integer> right) -> { if (left.size() > right.size()) return left.size() right.size(); for (int i = 0; i; < left.size(); i++) if (left.get(i) > right.get(i)) return left.get(i) right.get(i); return left.size() right.size(); }); The lambda s block can return values!
Try it Out /** Remove any non-increasing lists. */ public void filter(List<List<Integer>> lists) { }
Answer /** Remove any non-increasing lists. */ public void filter(List<List<Integer>> lists) { lists.removeIf((List<Integer> list) -> { int prev = Integer.MIN_VALUE; for (int i : list) // Ignoring nulls if (prev > i) return true; else prev = i; return false; }); }
Lambda vs. Anonymous Classes In many ways, lambda expressions are really just cleaner syntax The Java compiler converts lambdas into anonymous classes at compile time. Two key differences: - fields - this
Difference: Fields Anonymous classes can have fields /** Maps [3, 4, 5] to [3, 7, 12] */ public void sumPrev(List<Integer> ints) { ints.replaceAll(new UnaryOperator<Integer>() { int sum = 0; public Integer apply(Integer i) { sum += i; return sum; } }); }
Difference: this class Foo { void bar() { baz(new Anon() { Object func() { class Foo { void bar() { baz(() -> this); } } return this; } }); } Watch out!!! }