Javaの大海原をじゃばじゃばと

勉強メモとか雑記です

勉強メモ@プロJava/その4

optimisticにOptional の巻

▼初めて知ったことorどこかで読んだかもだけど忘れてたこと

「Optionalは値があるかないか管理するクラス」

「何かを掛けて何かを足して何かで割った余りを求めて疑似乱数を生成する手法を、線形合同法といいます」

「プロになるJava」より gihyo.jp

項番10.3.2 p.207練習問題なり

あれ?って悩んだ^^;

package projava;

import java.util.stream.Collectors;
import java.util.stream.IntStream;

public class StreamExercise3 {
    public static void main(String[] args) {

        System.out.println("--練習:\"test\"を3回連結して\"testtesttest\"を出力する処理を");
        System.out.println("\t" + "IntStreamを利用して実装してみましょう--");

        var nums = IntStream.range(0,3).toArray();
        System.out.println(IntStream.of(nums).mapToObj(n -> "test").collect(Collectors.joining()));

    }
}

▼コンソール

お!いけたっぽいど!
で、「プロになるJava」著者のお一人、きしだ なおき先生のブログで練習問題回答を拝見すると、
(見出しが「基本型でのStream」のところ)

nowokay.hatenablog.com

わーい、近いよね!?となり嬉しくなった^^
すんなり書けずテキスト行ったり来たりしたけどw

ちなみにJavaとは関係ないけれど、この記事の冒頭にノリで書いた「optimisticにOptional の巻」に関して

optimistic(楽天的な)とoptional(随意の)は同じ語源「opt」(=望む)から来てるそうな。へ〜

www.etn.co.jp

次はいよいよ「メソッド」の章だ〜!そしたら程なく第4部「高度なプログラミング」だ〜
レベル上げゲームやでうぇ〜い\(^o^)/

勉強メモ@プロJava/その3

項番10.2.6 p.203練習問題なり

package projava;

import java.util.List;
import java.util.Locale;
import java.util.stream.Collectors;

public class StreamExercise2 {
    public static void main(String[] args) {

        var strs = List.of("apple","banana","orange","pineapple");

        System.out.println("--①6文字以上のものを大文字にして表示");
        var upStrs = strs.stream().filter(s -> s.length() >= 6).map(s -> s.toUpperCase()).toList();
        upStrs.stream().forEach(s -> System.out.println(s));

        System.out.println("--②6文字以上のものの文字数を合計");
        var cntLetters =  upStrs.stream().collect(Collectors.joining()).length();
        System.out.println("6文字以上のものの文字数を合計すると:" + cntLetters + "文字");

        System.out.println("--③全ての文字列がaを含んでいるか判定");
        String msg = "";
        if (strs.stream().allMatch(s -> s.contains("a"))) {
            msg += "いる";
        }else{
            msg += "いない";
        }
        System.out.println("全ての文字列がaを含んで" + msg);

        System.out.println("--④cを含むものが一つでもあるかどうか判定");
        if(strs.stream().anyMatch(s -> s.contains("c"))){
            System.out.println("cを含むものが少なくとも一つはある");
        }else{
            System.out.println("cを含むものは一つもない");
        }
    }
}

▼コンソール

ひとまずOKなのかしら。今日はここまで!

勉強メモ@プロJava/その2

f:id:hanabooh:20220417235448p:plain 項番10.1.4 p.195練習問題なり

package projava;

import java.util.ArrayList;
import java.util.List;

public class StreamExercise {
    public static void main(String[] args) {
        System.out.println("--練習1:5文字ちょうどの文字列を表示する--");
        var fruits = List.of("apple","banana","grape");
        for (String fruit : fruits) {
            if (fruit.length() == 5){
                System.out.println(fruit);
            }
        }

        System.out.println("--練習2:5文字ちょうどの文字列を取り出した新たなListを作る--");
        var newFruits = new ArrayList<String>();
        for (String fruit : fruits) {
            if (fruit.length() == 5){
                newFruits.add(fruit);
            }
        }
        System.out.println(newFruits);

        System.out.println("--練習3:5文字ちょうどの文字列の個数を数える--");
        int count = 0;
        for (String fruit : newFruits) {
            count++;
        }
        System.out.println("5文字ちょうどの文字列の個数は:" + count);

        System.out.println("--練習4:5文字ちょうどの文字列全てが「p」を含むか確認する--");
        boolean allContainsFlg = false;
        for (String fruit : newFruits) {
            if(!fruit.contains("p")){
                allContainsFlg = false;
                break;
            }
            allContainsFlg = true;
        }
        if (allContainsFlg){
            System.out.println("5文字ちょうどの文字列全てが「p」を含む");
        }else{
            System.out.println("5文字ちょうどの文字列のうち少なくとも一つは「p」を含まない");
        }

        System.out.println("--練習5:5文字ちょうどの文字列のどれか一つでも「p」を含むか確認する--");
        boolean someContainsFlg = false;
        for (String fruit : newFruits) {
            if(fruit.contains("p")){
                someContainsFlg = true;
                break;
            }
        }
        if (someContainsFlg){
            System.out.println("5文字ちょうどの文字列のうち少なくとも一つは「p」を含む");
        }else{
            System.out.println("5文字ちょうどの文字列のいずれも「p」を含まない");
        }
    }
}

▼コンソール f:id:hanabooh:20220418001141p:plain うむ!「この問題わかりそうだから飛ばそかな」って思ったけど書いてみてよかった、 まだまだ自分にはやっぱ書くのに時間がかかる、ということがわかった。うむ、収穫収穫である! 寝よー

Java勉強メモ@プロJava

f:id:hanabooh:20220415221846p:plain

ブログ更新。9ヶ月ぶり!!久々の投稿はJava勉強記録_φ(・_・
先月3/28ごろから「プロになるJava」でJava勉強してます。そのメモ_φ( ̄ー ̄ )
今日は第8章の「データ構造」を進めているところ。

Listから5文字以上の文字列を抜き出して、新しいListを作る処理を考えてみます。ここではList.of("yamamoto","kis","sugiyama")を処理してみましょう。続きを読む前に自分で考えてみるのもいいですね。

出典:プロになるJava―仕事で必要なプログラミングの知識がゼロから身につく最高の指南書
きしだ なおき,山本 裕介,杉山 貴章

ということで、ちょっとしたコードではあるけど続きを読む前に書いた。

package projava;

import java.util.ArrayList;
import java.util.List;

public class StreamSample1 {
public static void main(String[] args) {
var names = List.of("yusuke","kis","sugiyama");
var nameList = new ArrayList<String>();
for (String name : names) {
if (name.length() >= 5){
nameList.add(name);
}
}
for (String s : nameList) {
System.out.println(s);
}
}
}

f:id:hanabooh:20220415232812p:plain

コンソールには無事表示された^^
変数のネーミングって難しいな・・・

★配列の復習
データ構造の章に入ったし、配列ってどういうものだっけ?という復習をしてみよう〜
JavaSilverテキストのこの説明↓、わかりやすいなーと思ったので読み直していた。

Javaの配列は「配列クラス」から作られた「インスタンス」であり、値の集合を扱うことを目的としています。値そのものと、値の集合を扱うインスタンスは異なるものである

出典:徹底攻略Java SE 11 Silver問題集[1Z0-815]対応 徹底攻略シリーズ

こういうことらしい。

f:id:hanabooh:20220416000239p:plain

今日はここまで・・・ゆるくていいので続けるのトラ〜イ。

そういやこの9ヶ月ほんま濃かった…仕事も生活もよき変化が多かった。
ブログ過去記事から、もがいていたことがわかる^^;
プロフィールとアイコン画像、一式更新して気分もまた一新。
9ヶ月前はまだ前職で、出口の見えない社内待機まっただ中で(文系未経験×コロナ×アラサー女性×小さい会社)メンタルヘドロやったもんな…
現状も悩みは色々あるけど、状況かなり好転してほんとありがたいので、やれることやってこ〜。

文字列同士の等値比較という初歩的なミスを繰り返さないために、シャレを考えてみた(IT勉強記録)

f:id:hanabooh:20210719212543p:plain
備忘録でございます_φ( ̄ー ̄ )そしてやっとこさ、はてブはてな記法デビュー\( ˆoˆ )/
コードきれいに表示されて感動する〜

「初学者がやりがち」とされる以下のトラップにまたハマってしまったので、自戒も込めて!
Javaで文字列同士を比較する場合、Stringクラスは参照型だから等値比較でなく等価比較せねばならない。と認識していますが
また等値比較やっちまったぜ…

前回の記事でひっそりと宣言した通り、2022年1月の転職に向けてSpring bootでポートフォリオを作成するんですが
急がば回れということでサーブレットJSPをさらっと復習した方が良さそうだな〜と思い、こちらのテキストで手を動かし中ながら勉強中でして。
その練習問題中で、トラップにハマってしまったのでした。
sukkiri.jp


▼上記テキスト中の練習問題(フォームを使ったユーザー登録もどきの作成)で私が書いたコード
※環境:IDE(Eclipse_2019-12)を使用・OSはmacOS Big Sur

formSample.jsp(入力フォームをレスポンスするJSPファイル)

<%@ page language="java" contentType="text/html; charset=UTF-8"
    pageEncoding="UTF-8"%>
<!DOCTYPE html>
<html>
<head>
<meta charset="UTF-8">
<title>登録フォーム</title>
</head>
<body>
<form action="/exampleFrom7/FormSampleServlet" method="post">
名前<br>
<input type="text" name="name"><br>
性別<br>
男<input type="radio" name="gender" value="0">
女<input type="radio" name="gender" value="1">
<input type="submit" value="登録">
</form>
</body>
</html>


【このコード内でやってしまった】FormSampleServlet.java(登録結果画面をレスポンスするサーブレットクラス)

package servlet;

import java.io.IOException;
import java.io.PrintWriter;

import javax.servlet.ServletException;
import javax.servlet.http.HttpServlet;
import javax.servlet.http.HttpServletRequest;
import javax.servlet.http.HttpServletResponse;

/**
 * Servlet implementation class FormSampleServlet
 */
public class FormSampleServlet extends HttpServlet {
	private static final long serialVersionUID = 1L;


	protected void doPost(HttpServletRequest request, HttpServletResponse response) throws ServletException, IOException {
		//リクエストパラメータの受け取り
		request.setCharacterEncoding("UTF-8");
		String name = request.getParameter("name");
		String gender = request.getParameter("gender");

		String msg = "";
		boolean isOK = true;

		if(name == null || name.length() == 0) {
			msg += "名前が入力されていません<br>";
			isOK = false;
		}
		if(gender == null || gender.length() == 0) {
			msg += "性別が選択されていません<br>";
			isOK = false;
		}else {
			if(gender=="0") {
				gender = "男性";
			}else {
				gender = "女性";
			}
		}

		if(isOK) {
			msg=name + "さん(" + gender + ")を登録しました";
		}

		response.setContentType("text/html; charset=UTF-8");
		PrintWriter out = response.getWriter();
		out.println("<!DOCTYPE html>");
		out.println("<html>");
		out.println("<head>");
		out.println("<title>ユーザー登録もどき</title>");
		out.println("</head>");
		out.println("<body>");
		out.println("<p>" + msg + "</p>");
		out.println("</body>");
		out.println("</html>");
	}

}

そう、登録された性別を確認するif文条件式内で、文字列同士の等値比較をしてしまっていました。正しくはこう、

if(gender.equals("0")) {

ですね。等値比較の記述でもコンパイルエラーにはならないけど、たまに動きがおかしくなる、といういや〜なもの。

もうこんな初歩的なミスを繰り返すまい!と思って、思いついたイメージがこちら。
「もじもじ(文字文字)したらあかん」

f:id:hanabooh:20210719212820j:plain

なんかこう色んなヤバさを醸し出す記事と画像ですが、恥はかき捨てです_φ( ̄ー ̄ )笑
ずさんな勉強記録になってしまったけど、ちょっとずつ精度上げて、有益な技術ブログをも執筆できるようになるぜい。
読んでくださりありがとうございましたm(_ _)m

精神と時の部屋からIt's been a while

f:id:hanabooh:20210716174812p:plain

2ヶ月ぶりにブログ更新するぜい。

前回の記事がこちら

hanabooh.hatenablog.com

この2ヶ月間、何をしててんというと、情報系の国家資格試験、基本情報技術者試験を受験するために勉強していたのでした。

www.jitec.ipa.go.jp

 

受験の決意表明をしていた記事がこちら

hanabooh.hatenablog.com

ブログ中で言っていたとおり、先日6月某日に受験してまいりまして、なんとか無事合格したと思われます。(パソコン受験のため、試験結果が受験後そっこー登録アドレスに送信される)

受験後ひといきついて、そうこうしているうちにもうすっかり、はてなブログがご無沙汰に。自己満足で書いているブログ、またぼちぼち更新しようと思います。

 

ただ、2022年1月転職!という目標ができたので、今後は雑記ブログよりも勉強記録ブログをちゃんとつけていこうと思います。(ブログ中に書くことで自分を追い込む笑)

よーしこれからも世界の片隅でぶつぶつ言うぞー!\( ˆoˆ )/

家事マシンな私と、生活に野性的な喜びを感じる私は共存している!

f:id:hanabooh:20210513225722p:plain

今日は、日々お世話になってるこちらのレシピ本を見ながら、玉ねぎ主役のビーフなしビーフシチューを作りました。簡単うまい!www.amazon.co.jp

調理中のこと。8割方できあがってかき混ぜてた時に、ん??という感覚がやってきた。

ふは〜〜ええ匂い〜〜ほんわ〜〜〜

(*´Д`*)

ん??

おかしい…

いつもなら料理って割と「義務感」からやってて、いかに早くミッションコンプリートできるかが最優先で、「心を無にして作業」している感じでした。そんな自分がちょっと残念だなーとかふと思いながらも。(予定ない朝にパンケーキ焼くとかは楽しい)
でも、今日はなんでか、童心が蘇ってきてビーフシチューのにおいがテンション上げてきて玉ねぎがトロトロに煮込めているのがワクワクして、
ご飯作るってええなーとシンプルに感じたのでした。
 
思ったというより感じたので、その瞬間は脳内で言語化してませんでしたが、
体が健康で歯があって鼻もつまってなくて空腹を感じることができて
食材を調達して調理する道具があることにきっとシンプルにありがたみを感じたのだろうか、うーむ。
ん、これは理屈の後付けか。笑
なんにせよ、「幸せ上手にならねば」的なアツからでなく、りきみなくふっと、あれ、シチューええ匂いやな、はっぴっぴ〜ほげ〜〜
って感覚になってた自分を振り返って、
今度は理屈を唱えてはいるけども、また思い出してほげほげはっぴ〜。
あれ、何言ってんでしょう…
 
ささやかな幸せをみんな拾いましょうね〜♡
ってことが言いたいのでなく
義務感で不動心でマシンの如く家事するときも、野生に返ったような何かいい気分で家事するときも、どっちもアリで、自分が自分で興味深かったということと、
自分以外の人もこういう感じってあるんかなーという興味が湧いたのでした。
 
いつにもまして何が言いたいのかよくわからない文章ですが
ビーフシチューの多幸感のせいにしとこう!うむ
読んでくださりありがとうございました。ぐっすり熟睡を!