Java Quiz. public static <T> int binarysearch (List<? extends Comparable<? super T>> list, T key);

Ähnliche Dokumente
Kapitel 6. Vererbung

1 Polymorphie (Vielgestaltigkeit)

Kapitel 6. Vererbung

Kapitel 6. Vererbung

Algorithmen und Datenstrukturen

Java Einführung Abstrakte Klassen und Interfaces

equals und hashcode SortedSet NavigableSet Assoziative Container Programmieren II Dr. Klaus Höppner Hochschule Darmstadt Sommersemester / 32

Java: Vererbung. Teil 3: super()

Objektorientierte Programmierung. Kapitel 12: Interfaces

Java Kurs für Anfänger Einheit 5 Methoden

Java-Schulung Grundlagen

Datenbankanwendungsprogrammierung Crashkurs Java

Distributed Computing Group

Algorithmen und Datenstrukturen 07

Grundlagen der Informatik Generische Klassen

Probeklausur: Programmierung WS04/05

3 Objektorientierte Konzepte in Java

Java Einführung Collections

A(T1) A(T2) A(T1) A(T2)

Bäume. Informatik B - Objektorientierte Programmierung in Java. Vorlesung 10: Collections 4. Inhalt. Bäume. Einführung. Bäume.

Java Generics & Collections

Eine Klasse beschreibt Objekte mit gleichen Attributen und Methoden.

Objects First With Java A Practical Introduction Using BlueJ. Mehr über Vererbung. Exploring polymorphism 1.0

C# im Vergleich zu Java

Java für Computerlinguisten

Objektorientierte Programmierung

Generische Typen in Java 1.5. Die Erweiterung der Java Language Specification

3 Objektorientierte Konzepte in Java

Objektorientierte Programmierung

Java Tipps für Lehrer. Table des matières. Einleitung

Objektorientierte Programmierung

Java: Eine Übersicht. Dennis Giffhorn. Lehrstuhl für Programmierparadigmen Universität Karlsruhe

Javakurs 2013 Objektorientierung

Typumwandlungen bei Referenztypen

Client-Server-Beziehungen

Selbststudium OOP Programmieren 1 - H1103 Felix Rohrer

Einführung in die Informatik: Programmierung und Software-Entwicklung, WS 14/15. Kapitel 11. Fehler und Ausnahmen 1

PIWIN I. Praktische Informatik für Wirtschaftsmathematiker, Ingenieure und Naturwissenschaftler I. Vorlesung 3 SWS WS 2007/2008

Software Engineering Klassendiagramme Einführung

Problemstellung. Informatik B - Objektorientierte Programmierung in Java. Vorlesung 24: Reflection 1. IDE und automatische Tests.

Schnittstellen implementieren am Beispiel Suchbaum

Vorlesung Programmieren

Übung 1 mit C# 6.0 MATTHIAS RONCORONI

Vorlesung Objektorientierte Programmierung Probeklausur

Test zu Grundlagen der Programmierung Leitung: Michael Hahsler. 21. November 2003

Java Schulung (Java 2 Java Development Kit 5 / 6)

Übersicht. Informatik 2 Teil 3 Anwendungsbeispiel für objektorientierte Programmierung

Klausur zur Einführung in die objektorientierte Programmierung mit Java

Besonderheiten von C#

Einführung Datentypen Verzweigung Schleifen Funktionen Dynamische Datenstrukturen. Java Crashkurs. Kim-Manuel Klein

Generische Datenstrukturen

Repetitorium Informatik (Java)

5.6 Vererbung. Vererbung

Einführung in die Informatik: Programmierung und Software-Entwicklung, WS 11/12. Kapitel 8. Arrays. Arrays

Einführung in die. objektorientierte Programmierung

Beispiellösung der Klausur zu Objektorientierte Programmierung mit Java 09. Juli 2004 (SS 2004)

Einführung in die Programmierung für Wirtschaftsinformatik

Praktikum Informatik II Prof. Dr. Martin Trauth, Dr. Michael Männel

Versuchsziele Kenntnisse in der Anwendung von: Sortieren mit Klassen Benutzung von generischen Klassen o Definition o Sortierung.

5. Tutorium zu Programmieren

Bean-Mapping mit MapStruct

Type Erasure in Java 5. Helmi Jouini Institut für Theoretische Informatik Universität Karlsruhe

Java - Programmierung - Objektorientierte Programmierung 1

Musterlösungen zur Klausur Informatik 3

Große Übung Praktische Informatik 1

im Rahmen des Seminars - Programmiersprachen Markus Nestvogel

Vorlesung 09: Mengen. Peter Thiemann SS 2010

Gliederung. Tutorium zur Vorlesung. Gliederung. Gliederung. 1. Gliederung der Informatik. 1. Gliederung der Informatik. 1. Gliederung der Informatik

Methoden. von Objekten definiert werden, Methoden,, Zugriffsmethoden und Read-Only

Klassen in Java. Klassen

Java Schulung. Objektorientierte Programmierung in Java Teil V: Die Java Collection Klassen. Prof. Dr. Nikolaus Wulff

Verhindert, dass eine Methode überschrieben wird. public final int holekontostand() {...} public final class Girokonto extends Konto {...

EINI WiMa/LW. Einführung in die Informatik für Naturwissenschaftler und Ingenieure. Vorlesung 2 SWS WS 11/12

7. Objektorientierte Softwareentwicklung/3. Informatik II für Verkehrsingenieure

Binärbäume. Prof. Dr. E. Ehses,

Primitive Datentypen

Vererbung & Schnittstellen in C#

Prof. Dr. Uwe Schmidt. 21. August Aufgaben zur Klausur Objektorientierte Programmierung im SS 2007 (IA 252)

Teil 1: Grundeigenschaften von Rechnern und Software

12) Generische Datenstrukturen

Lösungsvorschläge. zu den Aufgaben im Kapitel 4

Vererbung. Vererbung von Methoden und Instanzvariablen. Vererbung als Realisierung einer is-a Beziehung.

Propädeutikum zur Programmierung

Java Einführung VARIABLEN und DATENTYPEN Kapitel 2

Prinzipien Objektorientierter Programmierung

2.4.3 Polymorphie (Wiederholung von Alp2)

Android will doch nur spielen. Java Eine kurze Einführung

Javakurs für Anfänger

Softwaretechnologie - Wintersemester 2012/ Dr. Günter Kniesel

Arrays in Java. Text. Stefan Brotschi

Web-Services Implementierung mit Java

Anleitung. Ein einfaches RMI-Beispiel. (ab Java 5.0) c Y. Pfeifer. (Juni 2014)

Codegeneratoren mit Xtend , A. Arnold

VIII: Vererbung. Unterklassen einer Klasse. Vererbung von Methoden und Instanzvariablen. Überschreiben von Methoden

Einführung in Java. PING e.v. Weiterbildung Andreas Rossbacher 24. März 2005

5 Projekt Bankverwaltung

Aufgabenblatt Nr. 5 Generizität und TicTacToe

12) Generische Datenstrukturen

5.4 Klassen und Objekte

Programmierkurs Java

Transkript:

Java Quiz public abstract class Enum<E extends Enum<E>> //... public class Collections //... public static <T> int binarysearch (List<? extends Comparable<? super T>> list, T key); //... public static <T extends Object & Comparable<? super T>> T min(collection<? extends T> coll); //... Stand: 13. April 2010

Bigger Than Long BigInteger x = BigInteger.valueOf(2); for (int i = 0; i <= 64; ++i) x.add(x); System.out.println(x); 2^64 2^65 2^66 _ Compiler Laufzeit

Bigger Than Long BigInteger x = BigInteger.valueOf(2); for (int i = 0; i <= 64; ++i) x.add(x); System.out.println(x); /** * Immutable arbitrary-precision integers. */ public class BigInteger /** * Returns a BigInteger whose value is (this + val). */ public BigInteger add(biginteger val); 2^64 2^65 2^66 2 Compiler Laufzeit

Bigger Than Long BigInteger x = BigInteger.valueOf(2); for (int i = 0; i <= 64; ++i) x = x.add(x); System.out.println(x); /** * Immutable arbitrary-precision integers. */ public class BigInteger /** * Returns a BigInteger whose value is (this + val). */ public BigInteger add(biginteger val); 2^64 2^65 2^66 2 Compiler Laufzeit

Frühstücksbrühe String s = "Frühstücksbrühe"; int b = s.indexof('b'); int zähler = 0; for (int i = 0; i < 5; ++i) Character x = s.charat(i); Character y = s.charat(b + i); if (x == y) ++zähler; System.out.println(zähler); 0 1 2 3 4 Compiler Laufzeit

Frühstücksbrühe String s = "Frühstücksbrühe"; int b = s.indexof('b'); int zähler = 0; for (int i = 0; i < 5; ++i) Character x = s.charat(i); Character y = s.charat(b + i); if (x == y) ++zähler; System.out.println(zähler); Frühs brühe 0 1 2 3 4 Compiler Laufzeit

Boxing Ideally, boxing a given primitive value p would always yield an identical reference. In practice, this may not be feasible using existing implementation techniques. public final class Character //... public static Character valueof(char c) if (c <= 127) return CharacterCache.cache[(int) c]; return new Character(c); JLS 5.1.7 Boxing Conversion

Mensch Meier! class Lebewesen protected Lebewesen() System.out.println(this); class Mensch extends Lebewesen private String _name = "Kain"; public Mensch(String name) _name = name; public String tostring() return _name; new Mensch("Meier"); Lebewesen@ Mensch@ Kain Meier _

Mensch Meier! class Lebewesen protected Lebewesen() 1 System.out.println(this); class Mensch extends Lebewesen 3 private String _name = "Kain"; 4 public Mensch(String name) _name = name; 2 public String tostring() return _name; new Mensch("Meier"); Lebewesen@ Mensch@ Kain Meier null

Objektinitialisierung Die this-referenz hat im Superkonstruktor bereits den dynamischen Typ der Subklasse, obwohl das entsprechende Objekt noch gar nicht initialisiert wurde. Konstruktoren sollten daher niemals (direkt oder indirekt) redefinierbare Operationen der eigenen Klasse aufrufen! JLS 12.5 Creation of New Class Instances

Sternstunden int[] array = 1492, 1789, -65000000, -753, 0; Arrays.sort(array); int i = Arrays.asList(array).indexOf(1492); System.out.println(i * i); 0 1 4 9 16 Compiler Laufzeit

Sternstunden int[] array = 1492, 1789, -65000000, -753, 0; Arrays.sort(array); int i = Arrays.asList(array).indexOf(1492); System.out.println(i * i); Vor der Sortierung: [1492, 1789, -65000000, -753, 0] Nach der Sortierung: [-65000000, -753, 0, 1492, 1789] 0 1 4 9 16 Compiler Laufzeit

Sternstunden int[] array = 1492, 1789, -65000000, -753, 0; Arrays.sort(array); int i = Arrays.asList(array).indexOf(1492); System.out.println(i * i); Vor der Sortierung: [1492, 1789, -65000000, -753, 0] Nach der Sortierung: [-65000000, -753, 0, 1492, 1789] // Returns a fixed-size list backed by the specified array. public static <T> List<T> aslist(t... a); 0 1 4 9 16 Compiler Laufzeit

Sternstunden int[] array = 1492, 1789, -65000000, -753, 0; Arrays.sort(array); int i = Arrays.asList(array).indexOf(1492); System.out.println(i * i); Vor der Sortierung: [1492, 1789, -65000000, -753, 0] Nach der Sortierung: [-65000000, -753, 0, 1492, 1789] // Returns a fixed-size list backed by the specified array. public static <T> List<T> aslist(t... a); public static List<int[]> aslist(int[]... a); 0 1 4 9 16 Compiler Laufzeit

Sternstunden Integer[] array = 1492, 1789, -65000000, -753, 0; Arrays.sort(array); int i = Arrays.asList(array).indexOf(1492); System.out.println(i * i); Vor der Sortierung: [1492, 1789, -65000000, -753, 0] Nach der Sortierung: [-65000000, -753, 0, 1492, 1789] // Returns a fixed-size list backed by the specified array. public static <T> List<T> aslist(t... a); public static List<Integer> aslist(integer... a); 0 1 4 9 16 Compiler Laufzeit

Generische, variadische Funktionen Primitive Typen sind keine Referenztypen und können daher nicht als generische Typparameter verwendet werden. Daher existiert zu jedem primitiven Typ eine entsprechende Wrapperklasse mit impliziten Konvertierungsregeln (Auto-Boxing). Arrays von primitiven Typen sind Referenztypen. Es gibt keine Konvertierungsregeln von int[] nach Integer[]. Generische, variadische Funktionen behandeln int[] als ein einziges Argument, Integer[] dagegen als Argumentliste. JLS 15.12.2.4 Phase 3: Identify Applicable Variable Arity Methods

Kleine Primzahlen List<Integer> primes = new ArrayList<Integer>(); primes.add(1); primes.add(2); primes.add(3); primes.add(5); primes.add(7); primes.remove(1); // whoops, not actually a prime... //...so let's remove it again! nop removes 1 removes _ Compiler Laufzeit

Kleine Primzahlen List<Integer> primes = new ArrayList<Integer>(); primes.add(1); primes.add(2); primes.add(3); primes.add(5); primes.add(7); primes.remove(1); // whoops, not actually a prime... //...so let's remove it again! System.out.println(primes); [1, 3, 5, 7] nop removes 1 removes 2 Compiler Laufzeit

Kleine Primzahlen primes.add(1); primes.remove(1); // whoops, not actually a prime... //...so let's remove it again! public interface List<E> extends Collection<E> /** * Removes the first occurrence of the specified element */ boolean remove(object o); /** * Removes the element at the specified position */ E remove(int index); nop removes 1 removes 2 Compiler Laufzeit

Kleine Primzahlen Collection<Integer> primes = new ArrayList<Integer>(); primes.add(1); primes.add(2); primes.add(3); primes.add(5); primes.add(7); primes.remove(1); // whoops, not actually a prime... //...so let's remove it again! System.out.println(primes); [2, 3, 5, 7] nop removes 1 removes 2 Compiler Laufzeit

Hello, Hello, Hello static void createstrings(string x, String y, String z) x = "hello"; y = "hello" + ""; z = x + ""; public static void main(string[] args) String a[] = new String[3]; createstrings(a[0], a[1], a[2]); Set<String> set = new HashSet<String>(Arrays.asList(a)); System.out.println(set.size()); 0 1 2 3 Compiler Laufzeit

Hello, Hello, Hello static void createstrings(string x, String y, String z) x = "hello"; y = "hello" + ""; z = x + ""; public static void main(string[] args) String a[] = new String[3]; createstrings(a[0], a[1], a[2]); Set<String> set = new HashSet<String>(Arrays.asList(a)); System.out.println(set.size()); System.out.println(set); [null] 0 1 2 3 Compiler Laufzeit

Hello, Hello, Hello static void createstrings(string x, String y, String z) x = "hello"; y = "hello" + ""; z = x + ""; public static void main(string[] args) String a[] = new String[3]; createstrings(a[0], a[1], a[2]); a 0 1 2 3 Compiler Laufzeit

Hello, Hello, Hello static void createstrings(string x, String y, String z) x = "hello"; y = "hello" + ""; z = x + ""; public static void main(string[] args) String a[] = new String[3]; createstrings(a[0], a[1], a[2]); a x y z 0 1 2 3 Compiler Laufzeit

Hello, Hello, Hello static void createstrings(string x, String y, String z) x = "hello"; y = "hello" + ""; z = x + ""; public static void main(string[] args) String a[] = new String[3]; createstrings(a[0], a[1], a[2]); hello hello a x y z 0 1 2 3 Compiler Laufzeit

Hello, Hello, Hello static void createstrings(string x, String y, String z) x = "hello"; y = "hello" + ""; z = x + ""; public static void main(string[] args) String a[] = new String[3]; createstrings(a[0], a[1], a[2]); a 0 1 2 3 Compiler Laufzeit

Parameterübergabe Java hat nur einen Parameterübergabemechanismus: Übergabe per Wert (call by value, pass by value). Bei der Übergabe per Wert wirken sich Zuweisungen auf formalen Parametern niemals auf die aktuellen Parameter aus. Das wäre nur mittels Übergabe per Referenz möglich, die es in Java nicht gibt. In Java werden niemals Variablen oder Objekte übergeben, sondern ausschließlich primitive Werte oder Referenzen. Falsch: Objekte werden per Referenz übergeben. Korrekt: Referenzen werden per Wert übergeben. Eine swap-funktion, die die Belegung zweier Variablen vertauscht, ist in Java (mangels Übergabe per Referenz) nicht realisierbar. JLS 15.12.4 Runtime Evaluation of Method Invocation

Vor lauter Bäumen... Set<StringBuilder> set = new TreeSet<StringBuilder>(); StringBuilder x = new StringBuilder("hello"); StringBuilder y = new StringBuilder("world"); set.add(x); set.add(y); System.out.println(set.contains(y)); y.append("!"); System.out.println(set.contains(y)); y.delete(0, 5); System.out.println(set.contains(y)); f f f t f f t t f t t t Compiler Laufzeit

Vor lauter Bäumen... Set<StringBuilder> set = new TreeSet<StringBuilder>(); StringBuilder x = new StringBuilder("hello"); StringBuilder y = new StringBuilder("world"); set.add(x); set.add(y); // StringBuilder cannot be cast to Comparable System.out.println(set.contains(y)); y.append("!"); System.out.println(set.contains(y)); y.delete(0, 5); System.out.println(set.contains(y)); f f f t f f t t f t t t Compiler Laufzeit

Vor lauter Bäumen... Set<StringBuilder> set = new TreeSet<StringBuilder>(new C()); StringBuilder x = new StringBuilder("hello"); StringBuilder y = new StringBuilder("world"); set.add(x); set.add(y); System.out.println(set.contains(y)); y.append("!"); System.out.println(set.contains(y)); y.delete(0, 5); System.out.println(set.contains(y)); class C implements Comparator<StringBuilder> public int compare(stringbuilder x, StringBuilder y) return x.tostring().compareto(y.tostring()); f f f t f f t t f t t t Compiler Laufzeit

Vor lauter Bäumen... Set<StringBuilder> set = new TreeSet<StringBuilder>(new C()); StringBuilder x = new StringBuilder("hello"); StringBuilder y = new StringBuilder("world"); set.add(x); set.add(y); // hello < world System.out.println(set.contains(y)); y.append("!"); // hello < world! System.out.println(set.contains(y)); y.delete(0, 5); // hello <! System.out.println(set.contains(y)); class C implements Comparator<StringBuilder> public int compare(stringbuilder x, StringBuilder y) return x.tostring().compareto(y.tostring()); f f f t f f t t f t t t Compiler Laufzeit

Vor lauter Bäumen... Set<StringBuilder> set = new TreeSet<StringBuilder>(new C()); StringBuilder x = new StringBuilder("hello"); StringBuilder y = new StringBuilder("world"); set.add(x); set.add(y); System.out.println(set.contains(y)); y.append("!"); System.out.println(set.contains(y)); y.delete(0, 5); System.out.println(set.contains(y)); class C implements Comparator<StringBuilder> public int compare(stringbuilder x, StringBuilder y) return??? f f f t f f t t f t t t Compiler Laufzeit

Vor lauter Bäumen... Set<StringBuilder> set = new TreeSet<StringBuilder>(new C()); StringBuilder x = new StringBuilder("hello"); StringBuilder y = new StringBuilder("world"); set.add(x); set.add(y); System.out.println(set.contains(y)); y.append("!"); System.out.println(set.contains(y)); y.delete(0, 5); System.out.println(set.contains(y)); class C implements Comparator<StringBuilder> public int compare(stringbuilder x, StringBuilder y) return System.identityHashCode(x) - System.identityHashCode(y); f f f t f f t t f t t t Compiler Laufzeit

Gleichheit Veränderliche Objekte eignen sich nicht als Elemente in sortierten und Hash-basierten Sammlungen, weil die Invarianten der Sammlung durch Änderungen von außen verletzt werden können. Das Redefinieren von equals und hashcode ist in Objektklassen selten sinnvoll. Nach einer Veränderung können Objekte möglicherweise nicht mehr gefunden werden, obwohl sie noch enthalten sind. Gleiche Objekte können nicht in dasselbe HashSet eingefügt werden: for (int i = 0; i < 10; ++i) konten.add(new Konto(100)); Effective Java, Item 8: Methods Common to All Objects

Gedeckte Konten List<Konto> konten = new ArrayList<Konto>(); konten.add(new Konto( 1)); konten.add(new Konto(-2)); konten.add(new Konto(-3)); konten.add(new Konto( 4)); for (Konto konto: konten) if (konto.gibsaldo() < 0) konten.remove(konto); System.out.println(konten.size()); 0 1 2 3 4 Compiler Laufzeit

Gedeckte Konten List<Konto> konten = new ArrayList<Konto>(); konten.add(new Konto( 1)); konten.add(new Konto(-2)); konten.add(new Konto(-3)); konten.add(new Konto( 4)); for (Konto konto: konten) if (konto.gibsaldo() < 0) konten.remove(konto); System.out.println(konten.size()); java.util.concurrentmodificationexception 0 1 2 3 4 Compiler Laufzeit

Gedeckte Konten List<Konto> konten = new ArrayList<Konto>(); konten.add(new Konto( 1)); konten.add(new Konto(-2)); konten.add(new Konto(-3)); konten.add(new Konto( 4)); for (int i = 0; i < 4; ++i) Konto konto = konten.get(i); if (konto.gibsaldo() < 0) konten.remove(i); System.out.println(konten.size()); 0 1 2 3 4 Compiler Laufzeit

Gedeckte Konten List<Konto> konten = new ArrayList<Konto>(); konten.add(new Konto( 1)); konten.add(new Konto(-2)); konten.add(new Konto(-3)); konten.add(new Konto( 4)); for (int i = 0; i < 4; ++i) Konto konto = konten.get(i); if (konto.gibsaldo() < 0) konten.remove(i); System.out.println(konten.size()); java.lang.indexoutofboundsexception: Index: 3, Size: 3 0 1 2 3 4 Compiler Laufzeit

Gedeckte Konten List<Konto> konten = new ArrayList<Konto>(); konten.add(new Konto( 1)); konten.add(new Konto(-2)); konten.add(new Konto(-3)); konten.add(new Konto( 4)); for (int i = 0; i < konten.size(); ++i) Konto konto = konten.get(i); if (konto.gibsaldo() < 0) konten.remove(i); System.out.println(konten.size()); 0 1 2 3 4 Compiler Laufzeit

Gedeckte Konten List<Konto> konten = new ArrayList<Konto>(); konten.add(new Konto( 1)); konten.add(new Konto(-2)); konten.add(new Konto(-3)); konten.add(new Konto( 4)); for (int i = 0; i < konten.size(); ++i) Konto konto = konten.get(i); if (konto.gibsaldo() < 0) konten.remove(i); System.out.println(konten.size()); [1, -3, 4] 0 1 2 3 4 Compiler Laufzeit

Gedeckte Konten List<Konto> konten = new ArrayList<Konto>(); konten.add(new Konto( 1)); konten.add(new Konto(-2)); konten.add(new Konto(-3)); konten.add(new Konto( 4)); for (int i = 0; i < konten.size();) Konto konto = konten.get(i); if (konto.gibsaldo() < 0) konten.remove(i); else ++i; System.out.println(konten.size()); 0 1 2 3 4 Compiler Laufzeit

Gedeckte Konten List<Konto> konten = new ArrayList<Konto>(); konten.add(new Konto( 1)); konten.add(new Konto(-2)); konten.add(new Konto(-3)); konten.add(new Konto( 4)); for (Iterator<Konto> it = konten.iterator(); it.hasnext();) Konto konto = it.next(); if (konto.gibsaldo() < 0) it.remove(); System.out.println(konten.size()); 0 1 2 3 4 Compiler Laufzeit

Elemente entfernen Manuell über Sammlungen zu iterieren, um darin enthaltene Elemente zu entfernen, ist extrem fehleranfällig. Die fehlerfreien Lösungen besitzen quadratische Komplexität. Eigentlich wollen wir sagen: Entferne alle Elemente aus der Sammlung, die ein bestimmtes Prädikat erfüllen. Dieser Gedanke ist in Java nicht idiomatisch ausdrückbar.

Elemente filtern Alternativ kann man die Liste unverändert lassen und die gedeckten Konten in eine neue Liste übernehmen: List<Konto> gedeckte = new ArrayList<Konto>(); for (Konto konto: konten) if (konto.gibsaldo() >= 0) gedeckte.add(konto); System.out.println(gedeckte.size()); Diese Lösung ist simpel und besitzt lineare Komplexität. Das Abstraktionsniveau dieser imperativen Lösung ist recht niedrig.

Google Collections API List<Konto> gedeckte = Lists.newArrayList( Iterables.filter(konten, new Predicate<Konto>() public boolean apply(konto k) return k.gibsaldo() >= 0; ) ); http://code.google.com/p/google-collections/

Anonyme Funktionen in Java 7 List<Konto> gedeckte = Lists.newArrayList( Iterables.filter(konten, new Predicate<Konto>() public boolean apply(konto k) return k.gibsaldo() >= 0; ) ); List<Konto> gedeckte = Lists.newArrayList( Iterables.filter(konten, (Konto k) => k.gibsaldo() >= 0 ) ); http://puredanger.com/tech/2009/11/18/closures-after-all/

Blick über den Tellerrand Scala var gedeckte = konten.filter ( k => k.gibsaldo() >= 0 ); C# var gedeckte = konten.findall ( k => k.gibsaldo() >= 0 ); F# let gedeckte = List.filter (fun k -> k.gibsaldo >= 0) konten Ruby gedeckte = konten.reject k k.gibsaldo < 0 Python gedeckte = filter ( lambda k: k.gibsaldo() >= 0, konten ) Haskell gedeckte = filter ( \k -> gibsaldo k >= 0 ) konten

Abstraktionen Das Filtern von Elementen sollte nicht mit Schleifen programmiert werden, sondern als Algorithmus zur Verfügung stehen. Die Parametrisierung von Algorithmen mit Funktionen ist deutlich einfacher, wenn die Sprache anonyme Funktionen unterstützt. Ansonsten wird der Quelltext durch Boilerplate-Code verunstaltet. Quelltext auf einem höheren Abstraktionsniveau drückt die Absichten deutlicher aus und birgt weniger Fehlerpotential.