Skip to content

Commit

Permalink
Publish part 10
Browse files Browse the repository at this point in the history
  • Loading branch information
nygrenh committed Mar 31, 2020
1 parent 1119bf2 commit d4a10f0
Show file tree
Hide file tree
Showing 6 changed files with 68 additions and 32 deletions.
1 change: 0 additions & 1 deletion course-settings.js
Original file line number Diff line number Diff line change
Expand Up @@ -28,7 +28,6 @@ const courseSettings = {
{ separator: true, title: "Java Programming I" },
],
sidebarFuturePages: [
{ title: "Part 10", tba: "31.3." },
{ title: "Part 11", tba: "7.4." },
{ title: "Part 12", tba: "21.4." },
{ title: "Part 13", tba: "28.4." },
Expand Down
61 changes: 47 additions & 14 deletions data/part-10/1-handling-collections-as-streams.md
Original file line number Diff line number Diff line change
@@ -1,7 +1,7 @@
---
path: '/part-10/1-handling-collections-as-streams'
title: 'Handling collections as streams'
hidden: true
hidden: false
---


Expand Down Expand Up @@ -812,7 +812,7 @@ Fourth


<!-- ### Välioperaatiot -->
### Imtermediate Operations
### Intermediate Operations

<!-- Virran välioperaatiot ovat metodeja, jotka palauttavat arvonaan virran. Koska palautettava arvo on virta, voidaan välioperaatioita kutsua peräkkäin. Tyypillisiä välioperaatioita ovat arvon muuntaminen muodosta toiseen `map` sekä sen erityistapaus `mapToInt` eli virran muuntaminen kokonaislukuvirraksi, arvojen rajaaminen `filter`, uniikkien arvojen tunnistaminen `distinct` sekä arvojen järjestäminen `sorted` (mikäli mahdollista).

Expand Down Expand Up @@ -883,47 +883,79 @@ We'll use the `filter` method for filtering through only those persons who were
```java
// oletetaan, että käytössämme on lista henkiloita
// ArrayList<Henkilo> henkilot = new ArrayList<>();
// suppose we have a list of persons
// ArrayList<Person> persons = new ArrayList<>();
long lkm = henkilot.stream()
long count = persons.stream()
.filter(henkilo -> henkilo.getSyntymavuosi() < 1970)
.count();
System.out.println("Lukumäärä: " + lkm);
System.out.println("Count: " + count);
```
*Ongelma 2: Saat käyttöösi listan henkilöitä. Kuinka monen henkilön etunimi alkaa kirjaimella "A"?*
<!-- *Ongelma 2: Saat käyttöösi listan henkilöitä. Kuinka monen henkilön etunimi alkaa kirjaimella "A"?* -->
Käytetään `filter`-metodia henkilöiden rajaamiseen niihin, joiden etunimi alkaa kirjaimella "A". Lasketaan tämän jälkeen henkilöiden lukumäärä metodilla `count`.
*Problem 2: You'll receive a list of persons. How many person's first name starts with the letter "A"?*
<!-- Käytetään `filter`-metodia henkilöiden rajaamiseen niihin, joiden etunimi alkaa kirjaimella "A". Lasketaan tämän jälkeen henkilöiden lukumäärä metodilla `count`. -->
```java
Let's use the `filter`-method to narrow down the persons to those whose first name starts with the letter "A". Afterwards, we'll calculte the number of persons with the `count`-method.
<!-- ```java
// oletetaan, että käytössämme on lista henkiloita
// ArrayList<Henkilo> henkilot = new ArrayList<>();
long lkm = henkilot.stream()
.filter(henkilo -> henkilo.getEtunimi().startsWith("A"))
.count();
System.out.println("Lukumäärä: " + lkm);
``` -->
```java
// suppose we have a list of persons
// ArrayList<Person> persons = new ArrayList<>();
long count = persons.stream()
.filter(person -> persons.getFistName().startsWith("A"))
.count();
System.out.println("Count: " + count);
```
*Ongelma 3: Saat käyttöösi listan henkilöitä. Tulosta henkilöiden uniikit etunimet aakkosjärjestyksessä.*
<!-- *Ongelma 3: Saat käyttöösi listan henkilöitä. Tulosta henkilöiden uniikit etunimet aakkosjärjestyksessä.* -->
Käytetään ensin `map`-metodia, jonka avulla henkilö-olioita sisältävä virta muunnetaan etunimiä sisältäväksi virraksi. Tämän jälkeen kutsutaan metodia `distinct`, joka palauttaa virran, jossa on uniikit arvot. Seuraavaksi kutsutaan metodia `sorted`, joka järjestää merkkijonot. Lopulta kutsutaan metodia `forEach`, jonka avulla tulostetaan merkkijonot.
*Problem 3: You'll receive a list of persons. Print the number of unique first names in alphabetical order*

<!-- Käytetään ensin `map`-metodia, jonka avulla henkilö-olioita sisältävä virta muunnetaan etunimiä sisältäväksi virraksi. Tämän jälkeen kutsutaan metodia `distinct`, joka palauttaa virran, jossa on uniikit arvot. Seuraavaksi kutsutaan metodia `sorted`, joka järjestää merkkijonot. Lopulta kutsutaan metodia `forEach`, jonka avulla tulostetaan merkkijonot. -->

```java
First we'll use the `map` method to change a stream containing person objects into a stream containing first names. After that we'll call the `distinct`-method, that returns a stream that only contains unique values. Next, we call the method `sorted`, which sorts the strings. Finally, we call the method `forEach`, that is used to print the strings.


<!-- ```java
// oletetaan, että käytössämme on lista henkiloita
// ArrayList<Henkilo> henkilot = new ArrayList<>();


henkilot.stream()
.map(henkilo -> henkilo.getEtunimi())
.distinct()
.sorted()
.forEach(nimi -> System.out.println(nimi));
``` -->

```java
// suppose we have a list of persons
// ArrayList<Person> persons = new ArrayList<>();

persons.stream()
.map(person -> person.getFirstName())
.distinct()
.sorted()
.forEach(name -> System.out.println(name));
```

Yllä kuvattu `distinct`-metodi hyödyntää olioiden `equals`-metodia yhtäsuuruuden tarkasteluun. Metodi `sorted` taas osaa järjestää olioita, joilla on tieto siitä, miten olio tulee järjestää -- näitä ovat esimerkiksi luvut ja merkkijonot.
<!-- Yllä kuvattu `distinct`-metodi hyödyntää olioiden `equals`-metodia yhtäsuuruuden tarkasteluun. Metodi `sorted` taas osaa järjestää olioita, joilla on tieto siitä, miten olio tulee järjestää -- näitä ovat esimerkiksi luvut ja merkkijonot. -->

The `distinct`-method described above uses the `equals`-method that is in all objects for comparing whether two strings are the same. The `sorted`-method on the other hand is able to sort objects that contain some kind of order -- examples of this kind of objects are for example numbers and strings.


<!-- <programming-exercise name='Luettujen arvojen tulostaminen' tmcname='part10-Part10_05.LuettujenArvojenTulostaminen'> -->
Expand Down Expand Up @@ -1256,7 +1288,7 @@ The exercise template includes the probably familiar-y project "Cargo hold". How
<!-- Virta on myös erittäin näppärä tiedostojen käsittelyssä. Tiedoston lukeminen virtamuotoisena tapahtuu Javan valmiin <a href="https://docs.oracle.com/javase/8/docs/api/java/nio/file/Files.html" target="_blank" rel="noopener">Files</a>-luokan avulla. Files-luokan metodin `lines` avulla tiedostosta voidaan luoda syötevirta, jonka avulla tiedoston rivit voidaan käsitellä yksi kerrallaan. Metodi `lines` saa patametrikseen polun, joka luodaan luokan <a href="https://docs.oracle.com/javase/8/docs/api/java/nio/file/Paths.html" target="_blank" rel="noopener">Paths</a> tarjoamalla metodilla `get`, jolle annetaan parametrina tiedostopolkua kuvaava merkkijono.

Alla olevassa esimerkissä luetaan tiedoston "tiedosto.txt" kaikki rivit ja lisätään ne listaan. -->
Streams are also very handy in handling files. The file is read in stream form using Java's ready-made <a href="https://docs.oracle.com/javase/8/docs/api/java/nio/file/Files.html" target="_blank" rel="noopener">Files</a> class. The `lines` method in the files class allows you to create an input stream from a file, allowing you to process the rows one by one. The `lines` method gets a path as its parameter, which is created using the `get` method the <a href="https://docs.oracle.com/javase/8/docs/api/java/nio/file/Paths.html" target="_blank" rel="noopener">Paths</a> class. The `get` method is provided a string describing the file path.
<p>Streams are also very handy in handling files. The file is read in stream form using Java's ready-made <a href="https://docs.oracle.com/javase/8/docs/api/java/nio/file/Files.html" target="_blank" rel="noopener">Files</a> class. The `lines` method in the files class allows you to create an input stream from a file, allowing you to process the rows one by one. The `lines` method gets a path as its parameter, which is created using the `get` method the <a href="https://docs.oracle.com/javase/8/docs/api/java/nio/file/Paths.html" target="_blank" rel="noopener">Paths</a> class. The `get` method is provided a string describing the file path.</p>
The example below reads all the lines in "file.txt" and adds them to the list.
Expand Down Expand Up @@ -1309,6 +1341,7 @@ Implement the static method `public static List<String> read(String file)`, whic
<!-- Virran metodit tekevät määritellyn muotoisten tiedostojen lukemisesta melko suoraviivaista. Tarkastellaan tilannetta, missä tiedosto sisältää henkilöiden tietoja. Kukin henkilö on omalla rivillään, ensin tulee henkilön nimi, sitten puolipiste, sitten henkilön syntymävuosi. Tiedoston muoto on seuraava. -->
Stream methods make the reading of files that are of predefined format relatively straightforward. Let's look at a scenario where a file contains some personal information. Details of each person is on their own line, first the person's name, then the semicolon, then the person's Year of Birth. The file format is as follows.


Expand Down
14 changes: 8 additions & 6 deletions data/part-10/2-interface-comparable.md
Original file line number Diff line number Diff line change
@@ -1,7 +1,7 @@
---
path: '/part-10/2-interface-comparable'
title: 'Interface comparable'
hidden: true
hidden: false
---


Expand All @@ -10,9 +10,11 @@ hidden: true
<!-- - Tunnet Javan valmiin rajapinnan Comparable ja osaat toteuttaa sen omissa luokissasi.
- Osaat hyödyntää Javan valmiita välineitä sekä listojen järjestämiseen että virran alkioiden järjestämiseen.
- Osaat järjestää listan alkioita useampaa kriteeriä käyttäen (esim. osaat järjestää henkilöt nimen ja iän perusteella). -->

- You're aware of Java's Comparable class and now how to implement it in your own classes
- You know how to use Java's tools for sorting lists and stream elements.
- You know how to sort list elements using multiple criteria (e.g., you know how to sort a person based on name and age).

</text-box>


Expand All @@ -21,7 +23,7 @@ hidden: true
Comparable-rajapinnan vaatima compareTo-metodi saa parametrinaan olion, johon "this"-oliota verrataan. Mikäli olio on vertailujärjestyksessä ennen parametrina saatavaa olioa, tulee metodin palauttaa negatiivinen luku. Mikäli taas olio on järjestyksessä parametrina saatavan olion jälkeen, tulee metodin palauttaa positiivinen luku. Muulloin palautetaan luku 0. Tätä `compareTo`-metodin avulla johdettua järjestystä kutsutaan *luonnolliseksi järjestykseksi* (natural ordering).
Tarkastellaan tätä kerhossa käyvää lasta tai nuorta kuvaavan luokan Kerholainen avulla. Jokaisella kerholaisella on nimi ja pituus. Kerholaisten tulee mennä syömään pituusjärjestyksessä, joten toteutetaan kerholaisille rajapinta `Comparable`. Comparable-rajapinta ottaa tyyppiparametrinaan luokan, johon vertaus tehdään. Käytetään tyyppiparametrina samaa luokkaa `Kerholainen`. -->
In the previous section, we looked at interfaces in more general terms - let's now familiarize oruselves with one of Java's ready interfaces. The <a href="http://docs.oracle.com/javase/8/docs/api/java/lang/Comparable.html"> Comparable </a> interface defines the `compareTo` method used to compare objects. If a class implements the Comparable interface, objects created from that class can be sorted using Java's sorting algorithms.
<p>In the previous section, we looked at interfaces in more general terms - let's now familiarize oruselves with one of Java's ready interfaces. The <a href="http://docs.oracle.com/javase/8/docs/api/java/lang/Comparable.html"> Comparable </a> interface defines the `compareTo` method used to compare objects. If a class implements the Comparable interface, objects created from that class can be sorted using Java's sorting algorithms.</p>

The compareTo method required by the Comparable interface gets as its parameter the object to which the "this" object is compared. If the "this" object comes before the object received as a parameter in terms of sorting order, the method should return a negative number. If, on the other hand, id "this" object comes after the object received as a parameter, the method should return a positive number. Otherwise, 0 is returned. The sorting resulting from the `compareTo` method is called *natural ordering*.

Expand Down Expand Up @@ -295,8 +297,8 @@ public class Person implements Identifiable, Comparable<Person> {
}

@Override
public int compareTo(Person toinen) {
return this.getId().compareTo(toinen.getId());
public int compareTo(Person another) {
return this.getId().compareTo(another.getId());
}
}
```
Expand Down Expand Up @@ -378,7 +380,7 @@ Sekä luokan `Collections` metodille `sort` että virran metodille `sorted` void
We want to sort the list without having to implement the `Comparable` interface.
Both the `sort` method of `Collections` class and the stream's `sorted` method accept a lambda expression as a parameter that defines the sorting criteria. More specifically, both methods can be provided with an object that implements the <a href="https://docs.oracle.com/javase/8/docs/api/java/util/Comparator.html" target="_blank"> Comparator </a> interface, which defines the desired order - the lambda expression is used to create this object.
<p>Both the `sort` method of `Collections` class and the stream's `sorted` method accept a lambda expression as a parameter that defines the sorting criteria. More specifically, both methods can be provided with an object that implements the <a href="https://docs.oracle.com/javase/8/docs/api/java/util/Comparator.html" target="_blank"> Comparator </a> interface, which defines the desired order - the lambda expression is used to create this object.</p>

<!-- ```java
ArrayList<Henkilo> henkilot = new ArrayList<>();
Expand Down Expand Up @@ -551,7 +553,7 @@ pieces[1] = pieces[1].trim();
<!--
Joskus haluamme järjestää esineitä useamman asian perusteella. Tarkastellaan seuraavaksi esimerkkiä, missä elokuvat listataan nimen ja julkaisuvuoden perusteella järjestettynä. Tässä käytämme Javan valmista <a href="https://docs.oracle.com/javase/8/docs/api/java/util/Comparator.html" target="_blank" norel>Comparator</a>-luokkaa, joka tarjoaa menetelmiä järjestämiseen. Oletetaan, että käytössämme on seuraava luokka `Elokuva` -->

We sometimes want to sort items based on a number of things. Let's look at an example in which films are listed in order of their name and year of release. We'll make use of Java's <a href="https://docs.oracle.com/javase/8/docs/api/java/util/Comparator.html" target="_blank" norel>Comparator</a> class here, which offers us the functionality required for sorting. Le'ts assume that we have the clas `Film` at our disposal.
<p>We sometimes want to sort items based on a number of things. Let's look at an example in which films are listed in order of their name and year of release. We'll make use of Java's <a href="https://docs.oracle.com/javase/8/docs/api/java/util/Comparator.html" target="_blank" norel>Comparator</a> class here, which offers us the functionality required for sorting. Le'ts assume that we have the clas `Film` at our disposal.</p>

<!--
```java
Expand Down
11 changes: 6 additions & 5 deletions data/part-10/3-other-useful-techniques.md
Original file line number Diff line number Diff line change
@@ -1,7 +1,7 @@
---
path: '/part-10/3-other-useful-techniques'
title: 'Other useful techniques'
hidden: true
hidden: false
---


Expand Down Expand Up @@ -863,7 +863,8 @@ is not a spade

<!-- Huomaamme, että enumin tunnukset tulostuvat mukavasti! Oraclella on `enum`-tyyppiin liittyvä sivusto osoitteessa <a href="http://docs.oracle.com/javase/tutorial/java/javaOO/enum.html" target="_blank" rel="noopener">http://docs.oracle.com/javase/tutorial/java/javaOO/enum.html</a>.
-->
We see that the Enum values are outputted nicely! Oracle has a site related to the `enum` data type at <a href="http://docs.oracle.com/javase/tutorial/java/javaOO/enum.html" target="_blank" rel="noopener"> http://docs.oracle.com/javase/tutorial/java/javaOO/enum.html </a>.

<p>We see that the Enum values are outputted nicely! Oracle has a site related to the `enum` data type at <a href="http://docs.oracle.com/javase/tutorial/java/javaOO/enum.html" target="_blank" rel="noopener"> http://docs.oracle.com/javase/tutorial/java/javaOO/enum.html </a>.</p>


<!-- <text-box variant='hint' name='Enumien vertailu'> -->
Expand All @@ -882,8 +883,8 @@ The numeric identifier of an enum field value can be found with `ordinal()`. The


```java
public enum Maa {
RUUTU, PATA, RISTI, HERTTA
public enum Suits {
DIAMOND, CLUB, HEART, SPADE
}
```

Expand All @@ -893,7 +894,7 @@ System.out.println(Maa.HERTTA.ordinal());
``` -->
```java
System.out.println(Suit.DIAMOND.ordinal());
System.out.println(Suit.HEARTS.ordinal());
System.out.println(Suit.HEART.ordinal());
```

<sample-output>
Expand Down
4 changes: 2 additions & 2 deletions data/part-10/4-summary.md
Original file line number Diff line number Diff line change
@@ -1,11 +1,11 @@
---
path: '/part-10/4-summary'
title: 'Summary'
hidden: true
hidden: false
---

<!-- TODO: kerrotaan tiedon käsittelystä virtana ja mainitaan lyhyesti funktionaalinen ohjelmointi; puhutaan tiedon järjestämisestä ja järjestyksen täyrkeydestä. Kerrataan lyhyesti StringBuilder ja iteraattori. -->

Please take a moment to answer the quiz! Thank you!

<quiz id="f3f3b8b9-4725-5c89-9c52-a6e1ae289d81"></quiz>
<quiz id="f3f3b8b9-4725-5c89-9c52-a6e1ae289d81"></quiz>
9 changes: 5 additions & 4 deletions data/part-10/index.md
Original file line number Diff line number Diff line change
Expand Up @@ -2,18 +2,19 @@
path: '/part-10'
title: 'Part 10'
overview: true
hidden: true
hidden: false
---

<!-- Kurssimateriaalin kymmenennessä osassa tutustutaan tietokokoelmien käsittelyyn virtojen avulla. Opit luomaan virran tietokokoelmasta, rajaamaan virran arvoja, muuntamaan virran arvoja muodosta toiseen, ja keräämään virran arvoja toiseen tietokokoelmaan. Tutustut käsitteeseen lambdalauseke ja opit käyttämään sitä ohjemissasi. Opit myös järjestämään olioita Javan valmista Comparable-rajapintaa hyödyntäen ja tutustut muutamaan yleishyödylliseen työvälineeseen kuten säännöllinen lauseke, lueteltu tyyppi, ja iteraattori. -->
In the tenth part of the course we introduce handling collections with streams. You'll learn how to create a stream from a collection, filter the values of a stream, transform the values of a stream, and collect values of a stream to another collection. We introduce the concept lambda expression, and you'll learn to use it in your programs. You will also learn how to order objects using the Java Comparable interface, and some other useful techniques like regular expressions, enumerate type and iterator.

Only the exercises for this part are currently available in English!

<please-login></please-login>

<pages-in-this-section></pages-in-this-section>

Yllä oleva sisällysluettelo sisältää kurssin kymmenennen osan aihealueet. Kukin kurssin osa on suunniteltu siten, että siinä on työtä yhden viikon ajaksi. Kuhunkin kurssin osaan on hyvä varata reilusti yli kymmenen tuntia aikaa, riippuen aiemmasta tietokoneen käyttökokemuksesta. Ohjelmointia aiemmin kokeilleet saattavat edetä materiaalissa aluksi nopeamminkin.
<!-- Yllä oleva sisällysluettelo sisältää kurssin kymmenennen osan aihealueet. Kukin kurssin osa on suunniteltu siten, että siinä on työtä yhden viikon ajaksi. Kuhunkin kurssin osaan on hyvä varata reilusti yli kymmenen tuntia aikaa, riippuen aiemmasta tietokoneen käyttökokemuksesta. Ohjelmointia aiemmin kokeilleet saattavat edetä materiaalissa aluksi nopeamminkin. -->

The table of contents above lists the topics of the tenth part of the course. The tenth part has been designed to cover the tenth week of the course. You should reserve well above 10 hours for each part of the course, depending on previous experience with computers. If you've tried programming before, you might advance faster in the beginning.


<exercises-in-this-section></exercises-in-this-section>

0 comments on commit d4a10f0

Please sign in to comment.