java-development-for-beginners-learnit / 31 - JDK API /002 java.util.Optional - Optional in Java_en.srt
| 1 | |
| 00:00:06,000 --> 00:00:06,000 | |
| Hello, Jim. | |
| 2 | |
| 00:00:06,000 --> 00:00:09,000 | |
| In this lesson, we're going to learn optional class API. | |
| 3 | |
| 00:00:10,000 --> 00:00:16,000 | |
| We're going to start a lesson from the definition of optional class is understanding of the goal and | |
| 4 | |
| 00:00:16,000 --> 00:00:24,000 | |
| purpose of this class will help you to understand that better known this will be an optional class API. | |
| 5 | |
| 00:00:24,000 --> 00:00:31,000 | |
| And on real Covid examples I'm going to show you how to work was methods from optional class, and then | |
| 6 | |
| 00:00:31,000 --> 00:00:33,000 | |
| to the lesson of explaining when to use optional. | |
| 7 | |
| 00:00:33,000 --> 00:00:40,000 | |
| And you will understand in which cases use of optional will be efficient and will not bring more harm | |
| 8 | |
| 00:00:40,000 --> 00:00:41,000 | |
| than good. | |
| 9 | |
| 00:00:41,000 --> 00:00:48,000 | |
| Besides that, I will answer to the question what alternative techniques might be used instead of optional? | |
| 10 | |
| 00:00:48,000 --> 00:00:49,000 | |
| Let's stop. | |
| 11 | |
| 00:00:50,000 --> 00:00:53,000 | |
| And let me start from explanation of what optional class is. | |
| 12 | |
| 00:00:53,000 --> 00:00:54,000 | |
| And why do we need it? | |
| 13 | |
| 00:00:55,000 --> 00:00:56,000 | |
| Do you know what? | |
| 14 | |
| 00:00:56,000 --> 00:00:58,000 | |
| No point or exception is? | |
| 15 | |
| 00:00:58,000 --> 00:00:59,000 | |
| Probably. | |
| 16 | |
| 00:00:59,000 --> 00:01:04,000 | |
| This is one of the most popular exceptions that interrupts our program execution. | |
| 17 | |
| 00:01:04,000 --> 00:01:09,000 | |
| Just a reminder to all students that no point or exception is an exception. | |
| 18 | |
| 00:01:09,000 --> 00:01:10,000 | |
| That's a strong one. | |
| 19 | |
| 00:01:10,000 --> 00:01:13,000 | |
| We try to invoke some Masset on the reference. | |
| 20 | |
| 00:01:13,000 --> 00:01:15,000 | |
| It is not initialized. | |
| 21 | |
| 00:01:15,000 --> 00:01:17,000 | |
| In other words, we have variables. | |
| 22 | |
| 00:01:17,000 --> 00:01:21,000 | |
| It doesn't store reference to any of objects in the heap memory. | |
| 23 | |
| 00:01:22,000 --> 00:01:26,000 | |
| And when we call some Massart on the variable, we received no pointer exception. | |
| 24 | |
| 00:01:26,000 --> 00:01:32,000 | |
| That tells us that we actually can't invoke any Massart on the nothing. | |
| 25 | |
| 00:01:32,000 --> 00:01:33,000 | |
| Is that clear? | |
| 26 | |
| 00:01:33,000 --> 00:01:40,000 | |
| And to avoid cases like this, we should never forget to perform no check before any Massart invocation. | |
| 27 | |
| 00:01:41,000 --> 00:01:47,000 | |
| The new clause that has been introduced in Java eight is supposed to alleviate some problems. | |
| 28 | |
| 00:01:47,000 --> 00:01:53,000 | |
| In my opinion, the introduction of this class is controversial from one side. | |
| 29 | |
| 00:01:53,000 --> 00:02:00,000 | |
| It is grades that geoengineers has two legs, this one to indicate places where we may have no potentially. | |
| 30 | |
| 00:02:00,000 --> 00:02:07,000 | |
| But from the other side, in my opinion, optional class, often used by developers inappropriately | |
| 31 | |
| 00:02:07,000 --> 00:02:11,000 | |
| and brings into the code more complexity and harm than good. | |
| 32 | |
| 00:02:11,000 --> 00:02:16,000 | |
| But in this lesson, I will share with you my tips and other you use optional class efficiently. | |
| 33 | |
| 00:02:17,000 --> 00:02:23,000 | |
| Generally speaking written and no reference from any massata considered to be a bad practice. | |
| 34 | |
| 00:02:23,000 --> 00:02:30,000 | |
| For example, you call getta on the object that doesn't have all fields initialized yet, and you receive | |
| 35 | |
| 00:02:30,000 --> 00:02:31,000 | |
| no reference. | |
| 36 | |
| 00:02:31,000 --> 00:02:32,000 | |
| Indeed. | |
| 37 | |
| 00:02:32,000 --> 00:02:35,000 | |
| What else you should receive if there is nothing yet? | |
| 38 | |
| 00:02:36,000 --> 00:02:41,000 | |
| What if a field is really empty and doesn't initialized with any reference yet? | |
| 39 | |
| 00:02:41,000 --> 00:02:42,000 | |
| Thorney ha. | |
| 40 | |
| 00:02:43,000 --> 00:02:48,000 | |
| One of the giants of computer science wrote I call it my billion dollar mistake. | |
| 41 | |
| 00:02:49,000 --> 00:02:53,000 | |
| It was the invention of the no reference in nineteen sixty five. | |
| 42 | |
| 00:02:53,000 --> 00:03:00,000 | |
| I couldn't resist the temptation to put in a no reference simply because it was so easy to implement. | |
| 43 | |
| 00:03:01,000 --> 00:03:05,000 | |
| I can add to that it wasn't just so easy to implement. | |
| 44 | |
| 00:03:05,000 --> 00:03:08,000 | |
| It was also so logical to implement. | |
| 45 | |
| 00:03:09,000 --> 00:03:13,000 | |
| Let me start sharing my screen to explain the problems that we have today. | |
| 46 | |
| 00:03:13,000 --> 00:03:14,000 | |
| Is it optional? | |
| 47 | |
| 00:03:14,000 --> 00:03:21,000 | |
| Closs is intended to solve I open class problem statement from optional package of my little project. | |
| 48 | |
| 00:03:21,000 --> 00:03:24,000 | |
| In this example, imagine that we have instance of the computer. | |
| 49 | |
| 00:03:25,000 --> 00:03:32,000 | |
| We have some computer and USB drive, potentially USB drive, maybe plugged in or may not. | |
| 50 | |
| 00:03:33,000 --> 00:03:40,000 | |
| I can call yet USB drive Massart on my computer object to get the reference to the USB drive in case | |
| 51 | |
| 00:03:40,000 --> 00:03:42,000 | |
| Nassan is plugged in. | |
| 52 | |
| 00:03:42,000 --> 00:03:44,000 | |
| I receive no correct. | |
| 53 | |
| 00:03:44,000 --> 00:03:51,000 | |
| But in case there is a USB drive, I can get access to the right contacts switch to check it state. | |
| 54 | |
| 00:03:52,000 --> 00:03:55,000 | |
| In this case, I need to perform no check again. | |
| 55 | |
| 00:03:55,000 --> 00:03:57,000 | |
| Can you see how my code looks like? | |
| 56 | |
| 00:03:58,000 --> 00:04:03,000 | |
| And the good thing about all this is that I am smart enough to perform such checks. | |
| 57 | |
| 00:04:03,000 --> 00:04:07,000 | |
| It would be worse in case such checks wouldn't exist at all. | |
| 58 | |
| 00:04:08,000 --> 00:04:10,000 | |
| And to my program would just fail. | |
| 59 | |
| 00:04:10,000 --> 00:04:17,000 | |
| Units execution that understands the point, in addition, is just annoying that these checks get in | |
| 60 | |
| 00:04:17,000 --> 00:04:19,000 | |
| the way of the business logic. | |
| 61 | |
| 00:04:20,000 --> 00:04:24,000 | |
| In fact, Zedek reasons that overall are the beauty of our program. | |
| 62 | |
| 00:04:25,000 --> 00:04:27,000 | |
| What would be better than this? | |
| 63 | |
| 00:04:27,000 --> 00:04:33,000 | |
| It will be better to build data structure that would indicate presence or absence of the value. | |
| 64 | |
| 00:04:34,000 --> 00:04:35,000 | |
| That's what we need. | |
| 65 | |
| 00:04:35,000 --> 00:04:36,000 | |
| Optional Class four. | |
| 66 | |
| 00:04:37,000 --> 00:04:44,000 | |
| So we agreed that we need a mechanism that allows a massive developer to explicitly denote there's a | |
| 67 | |
| 00:04:44,000 --> 00:04:51,000 | |
| return value for a massive may or may not be present optional class acts as a prop for an object that | |
| 68 | |
| 00:04:51,000 --> 00:04:53,000 | |
| may not be present. | |
| 69 | |
| 00:04:53,000 --> 00:04:59,000 | |
| Therefore, if we know that our get USB drive mass, it may not return a desert object. | |
| 70 | |
| 00:05:00,000 --> 00:05:02,000 | |
| We can change message, return type. | |
| 71 | |
| 00:05:02,000 --> 00:05:10,000 | |
| Let me open solution class now in this class, you can see is that get USB drive message from my computer | |
| 72 | |
| 00:05:10,000 --> 00:05:12,000 | |
| class, has the friends or Chen typed now? | |
| 73 | |
| 00:05:13,000 --> 00:05:16,000 | |
| It is optional parametrized by the USB drive. | |
| 74 | |
| 00:05:17,000 --> 00:05:18,000 | |
| And then my USB drive. | |
| 75 | |
| 00:05:18,000 --> 00:05:20,000 | |
| I have also updated through Chintan. | |
| 76 | |
| 00:05:21,000 --> 00:05:28,000 | |
| Now, is this is optional that this parametrized by rights protects, which did not pay a lot of attention | |
| 77 | |
| 00:05:28,000 --> 00:05:35,000 | |
| to the details at this moment, namely how we create objects of optional type, why I use this method | |
| 78 | |
| 00:05:35,000 --> 00:05:36,000 | |
| and didn't use another one. | |
| 79 | |
| 00:05:36,000 --> 00:05:41,000 | |
| We're going to learn optional gloss in a minute was detailed examples. | |
| 80 | |
| 00:05:41,000 --> 00:05:46,000 | |
| Now, I'd like you to understand the idea of problem and our solution. | |
| 81 | |
| 00:05:46,000 --> 00:05:53,000 | |
| In my main mass, you can see that I use features of optional class and they check whether some value | |
| 82 | |
| 00:05:53,000 --> 00:05:55,000 | |
| is present in my USB drive wrapper. | |
| 83 | |
| 00:05:56,000 --> 00:06:01,000 | |
| And this present I execute functions that takes USB drive as my argument. | |
| 84 | |
| 00:06:02,000 --> 00:06:06,000 | |
| Namely, I'm getting access to the switch, which is also optional. | |
| 85 | |
| 00:06:06,000 --> 00:06:11,000 | |
| And in case it is present, I just print switches state to console. | |
| 86 | |
| 00:06:12,000 --> 00:06:14,000 | |
| And if no, then nothing. | |
| 87 | |
| 00:06:14,000 --> 00:06:20,000 | |
| And in case there is no USB drive object inside the wrapper, I execute another function. | |
| 88 | |
| 00:06:20,000 --> 00:06:22,000 | |
| I just print to console. | |
| 89 | |
| 00:06:22,000 --> 00:06:24,000 | |
| That USB drive wasn't found. | |
| 90 | |
| 00:06:24,000 --> 00:06:30,000 | |
| As you can see on this example, optional is a similar to the wrapper that may or may not contains the | |
| 91 | |
| 00:06:30,000 --> 00:06:33,000 | |
| actual value inside itself. | |
| 92 | |
| 00:06:33,000 --> 00:06:40,000 | |
| In simple words, you can view optional as a single value container that is a contains a value of doesn't. | |
| 93 | |
| 00:06:41,000 --> 00:06:44,000 | |
| It isn't set to be empty fullerenes. | |
| 94 | |
| 00:06:44,000 --> 00:06:49,000 | |
| This construction, you make clients responsible to handle messy value. | |
| 95 | |
| 00:06:49,000 --> 00:06:51,000 | |
| You're just walking. | |
| 96 | |
| 00:06:51,000 --> 00:06:56,000 | |
| That value here may not be present and you decide what you want to do. | |
| 97 | |
| 00:06:56,000 --> 00:07:04,000 | |
| In this case, this client's responsible approach means that creators and Massart is not in the position | |
| 98 | |
| 00:07:04,000 --> 00:07:07,000 | |
| to define what should be done in case of missing value. | |
| 99 | |
| 00:07:08,000 --> 00:07:12,000 | |
| Is a sink is to throw exception Maseru an exception? | |
| 100 | |
| 00:07:12,000 --> 00:07:17,000 | |
| Probably not always the best case and proper behavior according to the business logic in the case of | |
| 101 | |
| 00:07:17,000 --> 00:07:18,000 | |
| missing value. | |
| 102 | |
| 00:07:19,000 --> 00:07:23,000 | |
| Now, I wonder, you look at this example with fresh eyes. | |
| 103 | |
| 00:07:23,000 --> 00:07:29,000 | |
| If Java community and software engineers would like to call this more readable code and simple if URL | |
| 104 | |
| 00:07:29,000 --> 00:07:32,000 | |
| statement, I am happy to accept it. | |
| 105 | |
| 00:07:32,000 --> 00:07:36,000 | |
| Really, guys, I just want to we don't lie to ourselves. | |
| 106 | |
| 00:07:36,000 --> 00:07:43,000 | |
| What we have, instead of if as blogs with a few lambda expressions that are also located inside each | |
| 107 | |
| 00:07:43,000 --> 00:07:43,000 | |
| other. | |
| 108 | |
| 00:07:43,000 --> 00:07:50,000 | |
| And moreover, all our mass is written optional now, and we can't just take value and work with it | |
| 109 | |
| 00:07:50,000 --> 00:07:50,000 | |
| in order. | |
| 110 | |
| 00:07:50,000 --> 00:07:52,000 | |
| We could avoid no point exception. | |
| 111 | |
| 00:07:52,000 --> 00:07:56,000 | |
| Well, definitely optional is a very powerful tool. | |
| 112 | |
| 00:07:56,000 --> 00:08:00,000 | |
| But guys, I can't see what we have want in this case. | |
| 113 | |
| 00:08:01,000 --> 00:08:06,000 | |
| There are multiple other features in optional that breena's amazing flexibility. | |
| 114 | |
| 00:08:06,000 --> 00:08:11,000 | |
| And let us write less lines of code with optional than without it. | |
| 115 | |
| 00:08:12,000 --> 00:08:12,000 | |
| That is true. | |
| 116 | |
| 00:08:13,000 --> 00:08:20,000 | |
| But again, it should be also a special case to apply those features of optional is a true story from | |
| 117 | |
| 00:08:20,000 --> 00:08:26,000 | |
| my life is one developer from my team created few classes, was all massive rechanneled, optional type | |
| 118 | |
| 00:08:26,000 --> 00:08:28,000 | |
| parameterized by other types. | |
| 119 | |
| 00:08:28,000 --> 00:08:31,000 | |
| I asked him, why would you do that? | |
| 120 | |
| 00:08:31,000 --> 00:08:37,000 | |
| And he replied, because we need to use optional everywhere where we may receive no. | |
| 121 | |
| 00:08:37,000 --> 00:08:39,000 | |
| Well, guess not everywhere. | |
| 122 | |
| 00:08:39,000 --> 00:08:41,000 | |
| And then again, use an optional everywhere. | |
| 123 | |
| 00:08:42,000 --> 00:08:46,000 | |
| Wouldn't agree with us for the better with the abilities that we are so struggling for. | |
| 124 | |
| 00:08:46,000 --> 00:08:54,000 | |
| So let's not API optional to better understand its power and understand, jaysus, when and where this | |
| 125 | |
| 00:08:54,000 --> 00:08:54,000 | |
| might be applicable. | |
| 126 | |
| 00:08:55,000 --> 00:08:59,000 | |
| I open optional demo class with a lot of examples here. | |
| 127 | |
| 00:08:59,000 --> 00:09:01,000 | |
| Let me walk you through each example. | |
| 128 | |
| 00:09:01,000 --> 00:09:09,000 | |
| Seeing the first ones that we are going to review is how to create an object of optional type in most | |
| 129 | |
| 00:09:09,000 --> 00:09:15,000 | |
| of the cases to create object of type optional when it is static, factor in masses, optional class. | |
| 130 | |
| 00:09:16,000 --> 00:09:19,000 | |
| The first way to create optional is to call static mass of empty. | |
| 131 | |
| 00:09:20,000 --> 00:09:22,000 | |
| This is our chance imta optional. | |
| 132 | |
| 00:09:22,000 --> 00:09:28,000 | |
| The empty mass is often used when it is known apro or is at no value exists. | |
| 133 | |
| 00:09:28,000 --> 00:09:35,000 | |
| If you have some value and you need to create optional call, static method of attention, you need | |
| 134 | |
| 00:09:35,000 --> 00:09:42,000 | |
| to have that object behind's a reference that you are going to use to create optional object was of | |
| 135 | |
| 00:09:42,000 --> 00:09:49,000 | |
| mass, because in case you pass no value to the of method, you will get no point exception. | |
| 136 | |
| 00:09:49,000 --> 00:09:55,000 | |
| In the case, you know its value behind the reference, Megan, now or may not be now, use another | |
| 137 | |
| 00:09:55,000 --> 00:09:57,000 | |
| method of nullable. | |
| 138 | |
| 00:09:58,000 --> 00:10:02,000 | |
| This will create optional object based on the no and no not. | |
| 139 | |
| 00:10:02,000 --> 00:10:09,000 | |
| Various for example, in previous example, in solution, I used of nullable factor in mass because | |
| 140 | |
| 00:10:09,000 --> 00:10:14,000 | |
| I knew that I may need to create optional object based on value. | |
| 141 | |
| 00:10:15,000 --> 00:10:22,000 | |
| Now let's review methods that allow us to check if value is present or absent, that the masses that | |
| 142 | |
| 00:10:22,000 --> 00:10:27,000 | |
| allow us to check the value inside the optional is present and is empty. | |
| 143 | |
| 00:10:28,000 --> 00:10:31,000 | |
| Obviously, these masses are controversial. | |
| 144 | |
| 00:10:31,000 --> 00:10:37,000 | |
| One is present, returns true, is empty, returns false, and vice versa. | |
| 145 | |
| 00:10:37,000 --> 00:10:38,000 | |
| Here's an example. | |
| 146 | |
| 00:10:38,000 --> 00:10:46,000 | |
| You can see that I have destry quail and check was an optional is empty or has value and is a similar | |
| 147 | |
| 00:10:46,000 --> 00:10:48,000 | |
| test for optional that contains Nassan. | |
| 148 | |
| 00:10:49,000 --> 00:10:53,000 | |
| As a result of method execution, you confront and conceal output. | |
| 149 | |
| 00:10:54,000 --> 00:10:56,000 | |
| Now let's review example of conditional masses. | |
| 150 | |
| 00:10:57,000 --> 00:11:03,000 | |
| I call these methods conditional because based on the specific condition, API allows us to perform | |
| 151 | |
| 00:11:03,000 --> 00:11:05,000 | |
| one or another action. | |
| 152 | |
| 00:11:06,000 --> 00:11:12,000 | |
| The first method in this example, if present you already you saw me using this method in the example | |
| 153 | |
| 00:11:12,000 --> 00:11:18,000 | |
| in solution was use B drive F presence method takes consumer as method argument. | |
| 154 | |
| 00:11:19,000 --> 00:11:25,000 | |
| If you're not familiar with lambda expressions and such function interfaces as consumer, I recommend | |
| 155 | |
| 00:11:25,000 --> 00:11:26,000 | |
| you to pass my course. | |
| 156 | |
| 00:11:26,000 --> 00:11:29,000 | |
| Guanciale programming for Giwa Engineers. | |
| 157 | |
| 00:11:29,000 --> 00:11:32,000 | |
| I explained these topics in detail zere. | |
| 158 | |
| 00:11:32,000 --> 00:11:37,000 | |
| Just to remind you, consumer takes some argument and returns nothing. | |
| 159 | |
| 00:11:37,000 --> 00:11:41,000 | |
| So basically, if the value is present, we pass it. | |
| 160 | |
| 00:11:41,000 --> 00:11:44,000 | |
| Does it function and perform any action? | |
| 161 | |
| 00:11:44,000 --> 00:11:44,000 | |
| Was it. | |
| 162 | |
| 00:11:44,000 --> 00:11:47,000 | |
| What we need in this particular example. | |
| 163 | |
| 00:11:47,000 --> 00:11:51,000 | |
| I just printed to console in case there is no value in optional. | |
| 164 | |
| 00:11:51,000 --> 00:11:55,000 | |
| We just ignore this function and just do nothing. | |
| 165 | |
| 00:11:55,000 --> 00:11:59,000 | |
| Another conditional Massart is if present or else. | |
| 166 | |
| 00:11:59,000 --> 00:12:03,000 | |
| I also use this one in solution of the examples that I have already showed. | |
| 167 | |
| 00:12:03,000 --> 00:12:09,000 | |
| I believe that from the massive name, it is already clear for you what is this method for. | |
| 168 | |
| 00:12:09,000 --> 00:12:14,000 | |
| So in case value is present, will use consumer and will work with the value. | |
| 169 | |
| 00:12:15,000 --> 00:12:22,000 | |
| In the case, value is absent, will execute some random that contains lines of code to be executed. | |
| 170 | |
| 00:12:22,000 --> 00:12:24,000 | |
| In case there is no value. | |
| 171 | |
| 00:12:24,000 --> 00:12:28,000 | |
| The next example is simple and regular gets massive. | |
| 172 | |
| 00:12:28,000 --> 00:12:34,000 | |
| You can extract value from optional Bikel and get mass, but be attentive. | |
| 173 | |
| 00:12:34,000 --> 00:12:38,000 | |
| In case there is no value, you will get no such element. | |
| 174 | |
| 00:12:38,000 --> 00:12:38,000 | |
| The exception. | |
| 175 | |
| 00:12:39,000 --> 00:12:43,000 | |
| And here, in example, you can see this just in case optional is empty. | |
| 176 | |
| 00:12:43,000 --> 00:12:45,000 | |
| We are catching exception. | |
| 177 | |
| 00:12:45,000 --> 00:12:49,000 | |
| In practice, it is recommended to use is present. | |
| 178 | |
| 00:12:49,000 --> 00:12:53,000 | |
| Massett, that guarantees that there is a value inside optional. | |
| 179 | |
| 00:12:53,000 --> 00:12:55,000 | |
| So just remember this. | |
| 180 | |
| 00:12:56,000 --> 00:12:58,000 | |
| Let's imagine that we are using is present Massart. | |
| 181 | |
| 00:12:58,000 --> 00:12:59,000 | |
| OK. | |
| 182 | |
| 00:12:59,000 --> 00:13:01,000 | |
| Just look at this example. | |
| 183 | |
| 00:13:01,000 --> 00:13:09,000 | |
| How far it is from no check from our problem statement was if we again have the similar Evelio. | |
| 184 | |
| 00:13:09,000 --> 00:13:16,000 | |
| That's why in most cases we intentionally award to use the get Masset and use one of the other methods. | |
| 185 | |
| 00:13:16,000 --> 00:13:17,000 | |
| Such as. | |
| 186 | |
| 00:13:17,000 --> 00:13:23,000 | |
| Or else or else through top things of value associated with a populated, optional. | |
| 187 | |
| 00:13:24,000 --> 00:13:25,000 | |
| Or perform another action. | |
| 188 | |
| 00:13:25,000 --> 00:13:30,000 | |
| Let me show you this in the next example, you can see how to use or else mass. | |
| 189 | |
| 00:13:31,000 --> 00:13:36,000 | |
| Basically, it returns a value if at this present and in case it does not. | |
| 190 | |
| 00:13:36,000 --> 00:13:39,000 | |
| It returns the values that they passed as a message. | |
| 191 | |
| 00:13:39,000 --> 00:13:41,000 | |
| Also, we have or else get method. | |
| 192 | |
| 00:13:42,000 --> 00:13:45,000 | |
| What is the difference between orals and this? | |
| 193 | |
| 00:13:45,000 --> 00:13:48,000 | |
| Massively different parameters oils. | |
| 194 | |
| 00:13:48,000 --> 00:13:51,000 | |
| Yet they supply as methods argument. | |
| 195 | |
| 00:13:51,000 --> 00:13:54,000 | |
| Supply is a function that produce something. | |
| 196 | |
| 00:13:54,000 --> 00:13:57,000 | |
| It takes nothing and returns some value. | |
| 197 | |
| 00:13:57,000 --> 00:13:59,000 | |
| And what does it give us? | |
| 198 | |
| 00:14:00,000 --> 00:14:03,000 | |
| Well, probably it is not obvious in this particular example. | |
| 199 | |
| 00:14:04,000 --> 00:14:06,000 | |
| But let's look at the next lines. | |
| 200 | |
| 00:14:07,000 --> 00:14:14,000 | |
| Imagine that you have some massive that performs a lot of work and calculations and as a result, recharges | |
| 201 | |
| 00:14:14,000 --> 00:14:19,000 | |
| your reference to string value and then use your call or else Massett. | |
| 202 | |
| 00:14:19,000 --> 00:14:26,000 | |
| And you would like to parse the string returned by these massive PZM Massett is actually involved. | |
| 203 | |
| 00:14:27,000 --> 00:14:31,000 | |
| And you spent some time to wait until the mass of the got finished. | |
| 204 | |
| 00:14:32,000 --> 00:14:35,000 | |
| But is it the same with or else get method? | |
| 205 | |
| 00:14:35,000 --> 00:14:36,000 | |
| No. | |
| 206 | |
| 00:14:36,000 --> 00:14:45,000 | |
| Lukins this line you're actually not invoking is a massive you just Parsons's reference to the function | |
| 207 | |
| 00:14:45,000 --> 00:14:48,000 | |
| that knows how to get the value for you. | |
| 208 | |
| 00:14:48,000 --> 00:14:50,000 | |
| In case this is needed. | |
| 209 | |
| 00:14:51,000 --> 00:14:52,000 | |
| This is the main difference. | |
| 210 | |
| 00:14:53,000 --> 00:15:00,000 | |
| Lasing insolate Zeeshan in the first case we're invoking Massart no matter was an optional has a value | |
| 211 | |
| 00:15:00,000 --> 00:15:00,000 | |
| on. | |
| 212 | |
| 00:15:00,000 --> 00:15:00,000 | |
| No. | |
| 213 | |
| 00:15:01,000 --> 00:15:01,000 | |
| And in. | |
| 214 | |
| 00:15:01,000 --> 00:15:08,000 | |
| The second case would just use functions that knows how to provide us with value only when it is needed, | |
| 215 | |
| 00:15:09,000 --> 00:15:11,000 | |
| only when optional has no value. | |
| 216 | |
| 00:15:12,000 --> 00:15:18,000 | |
| Does it make sense now in case the value is absent and you want to throw an exception. | |
| 217 | |
| 00:15:18,000 --> 00:15:20,000 | |
| You can use or else throw massive. | |
| 218 | |
| 00:15:21,000 --> 00:15:23,000 | |
| This method is overloaded. | |
| 219 | |
| 00:15:23,000 --> 00:15:26,000 | |
| The version without arguments will throw no such element. | |
| 220 | |
| 00:15:26,000 --> 00:15:28,000 | |
| The exception by default. | |
| 221 | |
| 00:15:28,000 --> 00:15:35,000 | |
| Or you can post supplier as Mussert argument to generate object of the exception that you would like | |
| 222 | |
| 00:15:35,000 --> 00:15:35,000 | |
| to throw. | |
| 223 | |
| 00:15:36,000 --> 00:15:38,000 | |
| Now let's somehow filter Massart works. | |
| 224 | |
| 00:15:39,000 --> 00:15:45,000 | |
| In case you have the reference to the optional object, you can check it first to understand whether | |
| 225 | |
| 00:15:45,000 --> 00:15:46,000 | |
| it is much your predicate. | |
| 226 | |
| 00:15:47,000 --> 00:15:52,000 | |
| And in case verification this past, you receive optional was that value. | |
| 227 | |
| 00:15:52,000 --> 00:15:55,000 | |
| Otherwise, you receive empty optional. | |
| 228 | |
| 00:15:55,000 --> 00:15:57,000 | |
| Let me explain this example. | |
| 229 | |
| 00:15:57,000 --> 00:16:01,000 | |
| Imagine that I have optional that contains my full name. | |
| 230 | |
| 00:16:01,000 --> 00:16:07,000 | |
| After that, I can call Filton Masset on the optional object and pass predicate. | |
| 231 | |
| 00:16:07,000 --> 00:16:10,000 | |
| Let me quickly remind you what Prickett is. | |
| 232 | |
| 00:16:11,000 --> 00:16:14,000 | |
| CreditCard is a functional interface that declares one. | |
| 233 | |
| 00:16:14,000 --> 00:16:15,000 | |
| Massart is. | |
| 234 | |
| 00:16:15,000 --> 00:16:19,000 | |
| It takes one argument and the returns is a true or false. | |
| 235 | |
| 00:16:19,000 --> 00:16:21,000 | |
| So here is my function. | |
| 236 | |
| 00:16:21,000 --> 00:16:25,000 | |
| I pass full name and I check whether it contains Andry. | |
| 237 | |
| 00:16:25,000 --> 00:16:33,000 | |
| If yes, then I receive optional with this name when I call, or else I get the reference to my whole | |
| 238 | |
| 00:16:33,000 --> 00:16:36,000 | |
| name and bring that to console in a similar example. | |
| 239 | |
| 00:16:36,000 --> 00:16:39,000 | |
| But with a different name, I will get give empty optional. | |
| 240 | |
| 00:16:40,000 --> 00:16:46,000 | |
| And you can charge this by console output in the second case paren to console the false string that | |
| 241 | |
| 00:16:46,000 --> 00:16:48,000 | |
| they used in or else methods. | |
| 242 | |
| 00:16:48,000 --> 00:16:56,000 | |
| Do you understand why we may need to field the method that is normally used to reject wrapt values based | |
| 243 | |
| 00:16:56,000 --> 00:16:57,000 | |
| on the predefined tool? | |
| 244 | |
| 00:16:58,000 --> 00:17:04,000 | |
| Imagine now in another case we have a user object, and we need to make sure that the users that we | |
| 245 | |
| 00:17:04,000 --> 00:17:11,000 | |
| received from database or from another method has Mercier's less than one number than the more than | |
| 246 | |
| 00:17:11,000 --> 00:17:12,000 | |
| another number. | |
| 247 | |
| 00:17:13,000 --> 00:17:14,000 | |
| How to do that? | |
| 248 | |
| 00:17:14,000 --> 00:17:22,000 | |
| We can use map mass simply to convert the rabbit value to another type, Zimet, Mass, that allows | |
| 249 | |
| 00:17:22,000 --> 00:17:26,000 | |
| us to convert the value from one object to another. | |
| 250 | |
| 00:17:26,000 --> 00:17:33,000 | |
| If an optional is populated, this method can be thought of as a pipeline method, whereas the rabbit | |
| 251 | |
| 00:17:33,000 --> 00:17:37,000 | |
| value is passed along the pipeline and transform. | |
| 252 | |
| 00:17:37,000 --> 00:17:41,000 | |
| Can you value the remember how Stream API works? | |
| 253 | |
| 00:17:42,000 --> 00:17:43,000 | |
| This similar concept is here. | |
| 254 | |
| 00:17:44,000 --> 00:17:50,000 | |
| This method works by accepting the function object as it is applied to the rabbit value to produce the | |
| 255 | |
| 00:17:50,000 --> 00:17:51,000 | |
| mapped value. | |
| 256 | |
| 00:17:52,000 --> 00:17:58,000 | |
| Even the optional is empty, is a function object is never called, and an empty optional is returned | |
| 257 | |
| 00:17:58,000 --> 00:18:00,000 | |
| from the map massively. | |
| 258 | |
| 00:18:00,000 --> 00:18:02,000 | |
| Let me explain your own example. | |
| 259 | |
| 00:18:02,000 --> 00:18:05,000 | |
| I have optional parametrized by type user. | |
| 260 | |
| 00:18:05,000 --> 00:18:07,000 | |
| I have arrived here. | |
| 261 | |
| 00:18:07,000 --> 00:18:08,000 | |
| User object. | |
| 262 | |
| 00:18:08,000 --> 00:18:14,000 | |
| This user has named Igor and his universe is 1990s. | |
| 263 | |
| 00:18:14,000 --> 00:18:21,000 | |
| I call map Massart on my optional object to convert data in the pipeline from user to an end. | |
| 264 | |
| 00:18:22,000 --> 00:18:27,000 | |
| I need to pass functions that knows how to transform the current type thing. | |
| 265 | |
| 00:18:28,000 --> 00:18:35,000 | |
| And when I have int value in pipeline, I can use filter mass to check was a year of birth of the current | |
| 266 | |
| 00:18:35,000 --> 00:18:38,000 | |
| user is within the expected range. | |
| 267 | |
| 00:18:38,000 --> 00:18:44,000 | |
| In this case, my user matches the current filters and optional was very is returned. | |
| 268 | |
| 00:18:45,000 --> 00:18:49,000 | |
| That's why I can print the user's Berthier tokens. | |
| 269 | |
| 00:18:49,000 --> 00:18:55,000 | |
| So what does this example please let me know in case you have any questions in case something is still | |
| 270 | |
| 00:18:55,000 --> 00:18:56,000 | |
| unclear. | |
| 271 | |
| 00:18:56,000 --> 00:18:57,000 | |
| Please. | |
| 272 | |
| 00:18:57,000 --> 00:18:59,000 | |
| What's your question below this video? | |
| 273 | |
| 00:18:59,000 --> 00:19:02,000 | |
| And there will be happy to answer it. | |
| 274 | |
| 00:19:02,000 --> 00:19:06,000 | |
| Let's review another method that is similar to those in Map Mass. | |
| 275 | |
| 00:19:06,000 --> 00:19:11,000 | |
| Let's have the flat map Masset as an alternative for values transformation. | |
| 276 | |
| 00:19:12,000 --> 00:19:15,000 | |
| There is one main difference between these two masses. | |
| 277 | |
| 00:19:15,000 --> 00:19:21,000 | |
| The difference is that map transforms values only when Xe unwrap. | |
| 278 | |
| 00:19:21,000 --> 00:19:27,000 | |
| Whereas flat map takes a wrapped value and unwraps it before transforming it. | |
| 279 | |
| 00:19:28,000 --> 00:19:32,000 | |
| Let's make sure that you understood this following Z example. | |
| 280 | |
| 00:19:32,000 --> 00:19:41,000 | |
| So imagine that we keep working with the same user, but interested in sync in a mass returns, optional | |
| 281 | |
| 00:19:41,000 --> 00:19:45,000 | |
| to, for example, get name Massart, which is optional. | |
| 282 | |
| 00:19:45,000 --> 00:19:47,000 | |
| It is parametrized by string. | |
| 283 | |
| 00:19:48,000 --> 00:19:48,000 | |
| No. | |
| 284 | |
| 00:19:48,000 --> 00:19:54,000 | |
| And all what we know that's extracted from the optional parameterized by type user. | |
| 285 | |
| 00:19:55,000 --> 00:20:00,000 | |
| The first thing that I do, I want to convert optional of user to the just name. | |
| 286 | |
| 00:20:00,000 --> 00:20:01,000 | |
| What I got instead. | |
| 287 | |
| 00:20:02,000 --> 00:20:07,000 | |
| Instead, I got optional parameterized by optional the disbursements surprised by string. | |
| 288 | |
| 00:20:07,000 --> 00:20:11,000 | |
| That is because my get name Masset returns optional. | |
| 289 | |
| 00:20:11,000 --> 00:20:16,000 | |
| Having this wrapper, I can extract optional parameterized by a string. | |
| 290 | |
| 00:20:17,000 --> 00:20:22,000 | |
| It should contain the name of the user, and only after that I can extract user. | |
| 291 | |
| 00:20:23,000 --> 00:20:30,000 | |
| Don't you think that they added a lot of redundant steps similar to the Stream API from Jaedicke? | |
| 292 | |
| 00:20:30,000 --> 00:20:35,000 | |
| So that map doesn't rabs the value was additional optional. | |
| 293 | |
| 00:20:35,000 --> 00:20:42,000 | |
| So to achieve the same goal in a little bit simpler way is to call threads, map and parse the references | |
| 294 | |
| 00:20:42,000 --> 00:20:43,000 | |
| to get name message. | |
| 295 | |
| 00:20:44,000 --> 00:20:49,000 | |
| And now I can apply Ozz masses to extract value like or message. | |
| 296 | |
| 00:20:50,000 --> 00:20:54,000 | |
| And in console, you can see that the results are the same. | |
| 297 | |
| 00:20:54,000 --> 00:20:59,000 | |
| But the second option, Dukas, less lines of code to achieve is the same result. | |
| 298 | |
| 00:20:59,000 --> 00:21:00,000 | |
| Does it make sense? | |
| 299 | |
| 00:21:01,000 --> 00:21:08,000 | |
| In my opinion, we have removed all the most important masses from optional API that might come in handy. | |
| 300 | |
| 00:21:08,000 --> 00:21:15,000 | |
| But any way opens a source code of GMU to optional class by yourself and investigated. | |
| 301 | |
| 00:21:15,000 --> 00:21:21,000 | |
| Now let's discuss when and how to use optional to make sure it is not dangerous and you don't bring | |
| 302 | |
| 00:21:21,000 --> 00:21:23,000 | |
| more harm than good. | |
| 303 | |
| 00:21:24,000 --> 00:21:27,000 | |
| Let's review different parts of our program and different use cases. | |
| 304 | |
| 00:21:28,000 --> 00:21:30,000 | |
| And I will give you my advice. | |
| 305 | |
| 00:21:30,000 --> 00:21:31,000 | |
| Return values. | |
| 306 | |
| 00:21:32,000 --> 00:21:35,000 | |
| Often optionals are well suited for a chance values. | |
| 307 | |
| 00:21:36,000 --> 00:21:43,000 | |
| Originally, this was intended to be zem main use case in documentation that we can find. | |
| 308 | |
| 00:21:43,000 --> 00:21:44,000 | |
| Is it optional? | |
| 309 | |
| 00:21:44,000 --> 00:21:52,000 | |
| Type is primarily intended for use as a message, Chantae, where there is a growing need to represent | |
| 310 | |
| 00:21:52,000 --> 00:21:53,000 | |
| no result. | |
| 311 | |
| 00:21:53,000 --> 00:21:57,000 | |
| And we're using now is likely to cause errors. | |
| 312 | |
| 00:21:57,000 --> 00:22:04,000 | |
| And here I'd like to pay you extra attention in order you wouldn't follow code style of colleague of | |
| 313 | |
| 00:22:04,000 --> 00:22:08,000 | |
| mine who has all methods developed this optional type return. | |
| 314 | |
| 00:22:09,000 --> 00:22:16,000 | |
| You should return optional as of this set where there is a clear need to represent no result. | |
| 315 | |
| 00:22:17,000 --> 00:22:22,000 | |
| And we're using now is likely to cause errors, not everywhere. | |
| 316 | |
| 00:22:23,000 --> 00:22:27,000 | |
| But still, this recommendation leaves error for interpretations. | |
| 317 | |
| 00:22:27,000 --> 00:22:30,000 | |
| I would also add one more important thing to consider. | |
| 318 | |
| 00:22:31,000 --> 00:22:38,000 | |
| Use optional only in cases when you want to make client of your code responsible for handling of absent | |
| 319 | |
| 00:22:38,000 --> 00:22:39,000 | |
| value. | |
| 320 | |
| 00:22:39,000 --> 00:22:43,000 | |
| And this is really a good reason not to put optional the chandab everywhere. | |
| 321 | |
| 00:22:44,000 --> 00:22:44,000 | |
| Why? | |
| 322 | |
| 00:22:45,000 --> 00:22:52,000 | |
| Because in most cases, we need to provide ready to use API, but not make our clients seeing about | |
| 323 | |
| 00:22:52,000 --> 00:22:58,000 | |
| each return value, what to do in case value wasn't returned regarding the fields. | |
| 324 | |
| 00:22:59,000 --> 00:23:00,000 | |
| Let me put it simple. | |
| 325 | |
| 00:23:00,000 --> 00:23:04,000 | |
| You can create fields of optional type, but you shouldn't. | |
| 326 | |
| 00:23:04,000 --> 00:23:05,000 | |
| Why? | |
| 327 | |
| 00:23:05,000 --> 00:23:08,000 | |
| For me, it is a sign of a bad architecture. | |
| 328 | |
| 00:23:08,000 --> 00:23:13,000 | |
| You have fields known from the beginning that they may not be initialized. | |
| 329 | |
| 00:23:13,000 --> 00:23:20,000 | |
| But in this case, you have met Iraqui and that or the architecture was not implemented. | |
| 330 | |
| 00:23:20,000 --> 00:23:21,000 | |
| Solid principles. | |
| 331 | |
| 00:23:21,000 --> 00:23:27,000 | |
| Probably there are some classes that don't need all these fields, and it is just a matter of building | |
| 332 | |
| 00:23:27,000 --> 00:23:29,000 | |
| of proper Iraqui. | |
| 333 | |
| 00:23:29,000 --> 00:23:30,000 | |
| A lot of questions. | |
| 334 | |
| 00:23:30,000 --> 00:23:36,000 | |
| So I'll put it simple, the not to use optionals in fields parameters. | |
| 335 | |
| 00:23:36,000 --> 00:23:39,000 | |
| You can use optional methods, parameters. | |
| 336 | |
| 00:23:39,000 --> 00:23:42,000 | |
| But again, it is not recommended to do that. | |
| 337 | |
| 00:23:42,000 --> 00:23:45,000 | |
| It is recommended instead to have law that. | |
| 338 | |
| 00:23:46,000 --> 00:23:53,000 | |
| If you know that, you might need to invoke this method with no parameter or this empty optional, in | |
| 339 | |
| 00:23:53,000 --> 00:23:53,000 | |
| other words. | |
| 340 | |
| 00:23:54,000 --> 00:23:57,000 | |
| So just with mass, that takes no parameter. | |
| 341 | |
| 00:23:58,000 --> 00:24:04,000 | |
| But you also can have our law that was the same name, but which takes parameter. | |
| 342 | |
| 00:24:04,000 --> 00:24:05,000 | |
| Is that clear? | |
| 343 | |
| 00:24:05,000 --> 00:24:09,000 | |
| Some students ask me what is alternative to use an optional. | |
| 344 | |
| 00:24:10,000 --> 00:24:15,000 | |
| Well, the simplest alternative is to leave like our ancestors left. | |
| 345 | |
| 00:24:15,000 --> 00:24:19,000 | |
| Just use no value and do not forget, put no checks. | |
| 346 | |
| 00:24:20,000 --> 00:24:23,000 | |
| This is still the case in a lot of programs nowadays. | |
| 347 | |
| 00:24:23,000 --> 00:24:30,000 | |
| Another alternative might be a sort of an exception if absence of the value really brigg's the way of | |
| 348 | |
| 00:24:30,000 --> 00:24:31,000 | |
| your program execution. | |
| 349 | |
| 00:24:32,000 --> 00:24:37,000 | |
| Then you need to be prepared to handle specific exception and to handle it properly. | |
| 350 | |
| 00:24:37,000 --> 00:24:42,000 | |
| During the handling of this exception, you specify 70 fractions. | |
| 351 | |
| 00:24:42,000 --> 00:24:45,000 | |
| What is needed to be done in case the value is absent? | |
| 352 | |
| 00:24:46,000 --> 00:24:48,000 | |
| Almost a similar way you do with optional. | |
| 353 | |
| 00:24:49,000 --> 00:24:51,000 | |
| And another alternative is no objects. | |
| 354 | |
| 00:24:51,000 --> 00:24:58,000 | |
| You can create a time that has the same API, but it is empty inside and all my are error safe. | |
| 355 | |
| 00:24:59,000 --> 00:25:01,000 | |
| And when it is seen, you just create. | |
| 356 | |
| 00:25:01,000 --> 00:25:07,000 | |
| Instance of the empty object or just parcels, a reference to that empty constantly, for example, | |
| 357 | |
| 00:25:07,000 --> 00:25:10,000 | |
| in collections, glossaries, empty, list constant. | |
| 358 | |
| 00:25:11,000 --> 00:25:14,000 | |
| And instead of returning, no one least is expected. | |
| 359 | |
| 00:25:15,000 --> 00:25:16,000 | |
| You can just return empty. | |
| 360 | |
| 00:25:16,000 --> 00:25:22,000 | |
| These constant that will save you from no point exception remembers use of devices. | |
| 361 | |
| 00:25:23,000 --> 00:25:27,000 | |
| They're years of experience and millions of dollars behind these advices. | |
| 362 | |
| 00:25:28,000 --> 00:25:31,000 | |
| Let's recap what we have learned in this lesson. | |
| 363 | |
| 00:25:31,000 --> 00:25:32,000 | |
| In this lesson we learned. | |
| 364 | |
| 00:25:33,000 --> 00:25:35,000 | |
| Optional class API and its methods. | |
| 365 | |
| 00:25:36,000 --> 00:25:39,000 | |
| It knows the purpose of the optional and when to use it. | |
| 366 | |
| 00:25:39,000 --> 00:25:46,000 | |
| And at the end of the lesson, I also explained few alternative techniques to use instead of optional. | |
| 367 | |
| 00:25:46,000 --> 00:25:48,000 | |
| That's all for this lesson. | |
| 368 | |
| 00:25:48,000 --> 00:25:49,000 | |
| Thanks a lot for your attention. | |
| 369 | |
| 00:25:50,000 --> 00:25:52,000 | |
| Have a great day and see you in the next lesson. | |